TF-1877 Fix error TextEditingController was used after being disposed on some screen

(cherry picked from commit 50e4c6ec55eea21a45a5a8dd31cd239245248df3)
This commit is contained in:
dab246
2023-06-30 15:45:59 +07:00
committed by Dat Vu
parent 32adfb3581
commit 6c06d0742c
30 changed files with 377 additions and 942 deletions
@@ -60,15 +60,13 @@ class _TextFieldBuilderState extends State<TextFieldBuilder> {
@override @override
void initState() { void initState() {
super.initState();
if (widget.fromValue != null) { if (widget.fromValue != null) {
_controller = TextEditingController.fromValue(TextEditingValue(text: widget.fromValue!)); _controller = TextEditingController.fromValue(TextEditingValue(text: widget.fromValue!));
} else if (widget.controller != null) {
_controller = widget.controller!;
} else { } else {
_controller = TextEditingController(); _controller = widget.controller ?? TextEditingController();
} }
_textDirection = widget.textDirection; _textDirection = widget.textDirection;
super.initState();
} }
@override @override
@@ -58,9 +58,9 @@ class _TypeAheadFormFieldBuilderState<T> extends State<TypeAheadFormFieldBuilder
@override @override
void initState() { void initState() {
super.initState();
_textDirection = widget.textDirection; _textDirection = widget.textDirection;
_controller = widget.controller ?? TextEditingController(); _controller = widget.controller ?? TextEditingController();
super.initState();
} }
@override @override
+2
View File
@@ -1,10 +1,12 @@
import 'package:core/utils/app_logger.dart';
import 'package:get/get_instance/src/bindings_interface.dart'; import 'package:get/get_instance/src/bindings_interface.dart';
abstract class BaseBindings extends Bindings { abstract class BaseBindings extends Bindings {
@override @override
void dependencies() { void dependencies() {
log('BaseBindings::dependencies():');
bindingsDataSourceImpl(); bindingsDataSourceImpl();
bindingsDataSource(); bindingsDataSource();
bindingsRepositoryImpl(); bindingsRepositoryImpl();
+1 -3
View File
@@ -20,7 +20,6 @@ import 'package:model/account/authentication_type.dart';
import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_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/base/mixin/popup_context_menu_action_mixin.dart';
import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart';
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
@@ -55,8 +54,7 @@ import 'package:tmail_ui_user/main/utils/app_utils.dart';
abstract class BaseController extends GetxController abstract class BaseController extends GetxController
with MessageDialogActionMixin, with MessageDialogActionMixin,
PopupContextMenuActionMixin, PopupContextMenuActionMixin {
ViewAsDialogActionMixin {
final CachingManager cachingManager = Get.find<CachingManager>(); final CachingManager cachingManager = Get.find<CachingManager>();
final languageCacheManager = Get.find<LanguageCacheManager>(); final languageCacheManager = Get.find<LanguageCacheManager>();
+11 -25
View File
@@ -41,6 +41,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
@@ -378,32 +379,17 @@ abstract class BaseMailboxController extends BaseController {
mailboxIdSelected: mailboxSelected.id mailboxIdSelected: mailboxSelected.id
); );
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
onMovingMailboxAction(
mailboxSelected,
destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox
);
}
);
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
onMovingMailboxAction( onMovingMailboxAction(
mailboxSelected, mailboxSelected,
destinationMailbox == PresentationMailbox.unifiedMailbox destinationMailbox == PresentationMailbox.unifiedMailbox
? null ? null
: destinationMailbox : destinationMailbox
); );
}
} }
} }
} }
@@ -1,168 +0,0 @@
import 'package:flutter/material.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/contact/presentation/contact_bindings.dart';
import 'package:tmail_ui_user/features/contact/presentation/contact_view.dart';
import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_bindings.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_view.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_view.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_view.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_view.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
mixin ViewAsDialogActionMixin {
void showDialogDestinationPicker({
required BuildContext context,
required DestinationPickerArguments arguments,
required Function(PresentationMailbox) onSelectedMailbox
}) {
DestinationPickerBindings().dependencies();
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black.withAlpha(24),
pageBuilder: (context, animation, secondaryAnimation) {
return DestinationPickerView.fromArguments(
arguments,
onDismissCallback: () {
DestinationPickerBindings().dispose();
popBack();
},
onSelectedMailboxCallback: (destinationMailbox) {
DestinationPickerBindings().dispose();
popBack();
if (destinationMailbox is PresentationMailbox) {
onSelectedMailbox.call(destinationMailbox);
}
});
});
}
void showDialogMailboxCreator({
required BuildContext context,
required MailboxCreatorArguments arguments,
required Function(NewMailboxArguments) onCreatedMailbox
}) {
MailboxCreatorBindings().dependencies();
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black.withAlpha(24),
pageBuilder: (context, animation, secondaryAnimation) {
return MailboxCreatorView.fromArguments(
arguments,
onDismissCallback: () {
MailboxCreatorBindings().dispose();
popBack();
},
onCreatedMailboxCallback: (arguments) {
MailboxCreatorBindings().dispose();
popBack();
if (arguments is NewMailboxArguments) {
onCreatedMailbox.call(arguments);
}
});
});
}
void showDialogContactView({
required BuildContext context,
required ContactArguments arguments,
required Function(EmailAddress) onSelectedContact
}) {
ContactBindings().dependencies();
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black.withAlpha(24),
pageBuilder: (context, animation, secondaryAnimation) {
return ContactView.fromArguments(
arguments,
onDismissCallback: () {
ContactBindings().dispose();
popBack();
},
onSelectedContactCallback: (emailAddress) {
ContactBindings().dispose();
popBack();
onSelectedContact.call(emailAddress);
});
});
}
void showDialogIdentityCreator({
required BuildContext context,
required IdentityCreatorArguments arguments,
required Function(dynamic) onCreatedIdentity
}) {
IdentityCreatorBindings().dependencies();
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black.withAlpha(24),
pageBuilder: (context, animation, secondaryAnimation) {
return IdentityCreatorView.fromArguments(
arguments,
onDismissCallback: () {
IdentityCreatorBindings().dispose();
popBack();
},
onCreatedIdentityCallback: (args) {
IdentityCreatorBindings().dispose();
popBack();
onCreatedIdentity.call(args);
});
});
}
void showDialogRuleFilterCreator({
required BuildContext context,
required RulesFilterCreatorArguments arguments,
required Function(dynamic) onCreatedRuleFilter
}) {
RulesFilterCreatorBindings().dependencies();
showGeneralDialog(
context: context,
barrierDismissible: true,
barrierLabel: '',
barrierColor: Colors.black.withAlpha(24),
pageBuilder: (context, animation, secondaryAnimation) {
return RuleFilterCreatorView.fromArguments(
arguments,
onDismissCallback: () {
RulesFilterCreatorBindings().dispose();
popBack();
},
onCreatedRuleFilterCallback: (args) {
RulesFilterCreatorBindings().dispose();
popBack();
onCreatedRuleFilter.call(args);
});
});
}
}
@@ -22,8 +22,8 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ContactController extends BaseController { class ContactController extends BaseController {
TextEditingController? textInputSearchController; final TextEditingController textInputSearchController = TextEditingController();
FocusNode? textInputSearchFocus; final FocusNode textInputSearchFocus = FocusNode();
ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact; ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact;
final searchQuery = SearchQuery.initial().obs; final searchQuery = SearchQuery.initial().obs;
@@ -32,9 +32,9 @@ class ContactController extends BaseController {
GetAutoCompleteWithDeviceContactInteractor? _getAutoCompleteWithDeviceContactInteractor; GetAutoCompleteWithDeviceContactInteractor? _getAutoCompleteWithDeviceContactInteractor;
GetAutoCompleteInteractor? _getAutoCompleteInteractor; GetAutoCompleteInteractor? _getAutoCompleteInteractor;
late Debouncer<String> _deBouncerTime; final Debouncer<String> _deBouncerTime = Debouncer<String>(const Duration(milliseconds: 500), initialValue: '');
late AccountId _accountId; AccountId? _accountId;
late Session _session; Session? _session;
ContactArguments? arguments; ContactArguments? arguments;
EmailAddress? contactSelected; EmailAddress? contactSelected;
@@ -44,14 +44,19 @@ class ContactController extends BaseController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
textInputSearchController = TextEditingController(); log('ContactController::onInit():arguments: ${Get.arguments}');
textInputSearchFocus = FocusNode(); arguments = Get.arguments;
_initializeDebounceTimeTextSearchChange(); _deBouncerTime.values.listen((value) {
searchQuery.value = SearchQuery(value);
_searchContactByNameOrEmail(searchQuery.value.value);
});
} }
@override @override
void onReady() async { void onReady() async {
textInputSearchFocus?.requestFocus(); super.onReady();
log('ContactController::onReady():');
textInputSearchFocus.requestFocus();
if (arguments != null) { if (arguments != null) {
_accountId = arguments!.accountId; _accountId = arguments!.accountId;
_session = arguments!.session; _session = arguments!.session;
@@ -68,25 +73,17 @@ class ContactController extends BaseController {
const Duration(milliseconds: 500), const Duration(milliseconds: 500),
() => _checkContactPermission()); () => _checkContactPermission());
} }
super.onReady();
} }
@override @override
void onClose() { void onClose() {
_disposeWidget(); log('ContactController::onClose():');
textInputSearchFocus.dispose();
textInputSearchController.dispose();
_deBouncerTime.cancel();
super.onClose(); super.onClose();
} }
void _initializeDebounceTimeTextSearchChange() {
_deBouncerTime = Debouncer<String>(
const Duration(milliseconds: 500),
initialValue: '');
_deBouncerTime.values.listen((value) async {
searchQuery.value = SearchQuery(value);
_searchContactByNameOrEmail(searchQuery.value.value);
});
}
void onTextSearchChange(String text) { void onTextSearchChange(String text) {
_deBouncerTime.value = text; _deBouncerTime.value = text;
} }
@@ -96,9 +93,9 @@ class ContactController extends BaseController {
} }
void clearAllTextInputSearchForm() { void clearAllTextInputSearchForm() {
textInputSearchController?.clear(); textInputSearchController.clear();
searchQuery.value = SearchQuery.initial(); searchQuery.value = SearchQuery.initial();
textInputSearchFocus?.requestFocus(); textInputSearchFocus.requestFocus();
} }
void _checkContactPermission() async { void _checkContactPermission() async {
@@ -167,32 +164,14 @@ class ContactController extends BaseController {
} }
} }
void _disposeWidget() {
textInputSearchFocus?.dispose();
textInputSearchFocus = null;
textInputSearchController?.dispose();
textInputSearchController = null;
_deBouncerTime.cancel();
}
void selectContact(BuildContext context, EmailAddress emailAddress) { void selectContact(BuildContext context, EmailAddress emailAddress) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
popBack(result: emailAddress);
if (PlatformInfo.isWeb) {
onSelectedContactCallback?.call(emailAddress);
} else {
popBack(result: emailAddress);
}
} }
void closeContactView(BuildContext context) { void closeContactView(BuildContext context) {
clearAllTextInputSearchForm(); clearAllTextInputSearchForm();
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
popBack();
if (PlatformInfo.isWeb) {
onDismissContactView?.call();
} else {
popBack();
}
} }
} }
@@ -8,7 +8,6 @@ import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/suggestion_email_address.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/suggestion_email_address.dart';
import 'package:tmail_ui_user/features/contact/presentation/contact_controller.dart'; import 'package:tmail_ui_user/features/contact/presentation/contact_controller.dart';
import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart';
import 'package:tmail_ui_user/features/contact/presentation/utils/contact_utils.dart'; import 'package:tmail_ui_user/features/contact/presentation/utils/contact_utils.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/app_bar_contact_widget.dart'; import 'package:tmail_ui_user/features/contact/presentation/widgets/app_bar_contact_widget.dart';
import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_suggestion_box_item.dart'; import 'package:tmail_ui_user/features/contact/presentation/widgets/contact_suggestion_box_item.dart';
@@ -20,23 +19,7 @@ class ContactView extends GetWidget<ContactController> {
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>(); final _imagePaths = Get.find<ImagePaths>();
@override ContactView({super.key});
final controller = Get.find<ContactController>();
ContactView({Key? key}) : super(key: key) {
controller.arguments = Get.arguments;
}
ContactView.fromArguments(
ContactArguments arguments, {
Key? key,
SelectedContactCallbackAction? onSelectedContactCallback,
VoidCallback? onDismissCallback
}) : super(key: key) {
controller.arguments = arguments;
controller.onSelectedContactCallback = onSelectedContactCallback;
controller.onDismissContactView = onDismissCallback;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -82,7 +65,7 @@ class ContactView extends GetWidget<ContactController> {
imagePaths: _imagePaths, imagePaths: _imagePaths,
searchQuery: controller.searchQuery.value, searchQuery: controller.searchQuery.value,
searchFocusNode: controller.textInputSearchFocus, searchFocusNode: controller.textInputSearchFocus,
searchInputController :controller.textInputSearchController, searchInputController: controller.textInputSearchController,
hasBackButton: false, hasBackButton: false,
hasSearchButton: true, hasSearchButton: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
@@ -104,8 +104,4 @@ class DestinationPickerBindings extends BaseBindings {
Get.find<StateDataSource>(), Get.find<StateDataSource>(),
)); ));
} }
void dispose() {
Get.delete<DestinationPickerController>();
}
} }
@@ -3,7 +3,7 @@ import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart'; import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/app_toast.dart';
import 'package:core/presentation/utils/keyboard_utils.dart'; import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
@@ -41,8 +41,6 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
typedef OnSelectedMailboxCallback = Function(PresentationMailbox? destinationMailbox);
class DestinationPickerController extends BaseMailboxController { class DestinationPickerController extends BaseMailboxController {
final _uuid = Get.find<Uuid>(); final _uuid = Get.find<Uuid>();
@@ -59,19 +57,16 @@ class DestinationPickerController extends BaseMailboxController {
final mailboxDestination = Rxn<PresentationMailbox>(); final mailboxDestination = Rxn<PresentationMailbox>();
final newNameMailbox = Rxn<String>(); final newNameMailbox = Rxn<String>();
FocusNode? nameInputFocusNode;
TextEditingController? nameInputController;
TextEditingController? searchInputController;
FocusNode? searchFocus;
DestinationPickerArguments? arguments; DestinationPickerArguments? arguments;
Session? _session; Session? _session;
AccountId? accountId; AccountId? accountId;
MailboxId? mailboxIdSelected; MailboxId? mailboxIdSelected;
OnSelectedMailboxCallback? onSelectedMailboxCallback;
VoidCallback? onDismissDestinationPicker;
List<String> listMailboxNameAsStringExist = <String>[]; List<String> listMailboxNameAsStringExist = <String>[];
final FocusNode nameInputFocusNode = FocusNode();
final FocusNode searchFocus = FocusNode();
final TextEditingController nameInputController = TextEditingController();
final TextEditingController searchInputController = TextEditingController();
final destinationListScrollController = ScrollController(); final destinationListScrollController = ScrollController();
DestinationPickerController( DestinationPickerController(
@@ -91,17 +86,14 @@ class DestinationPickerController extends BaseMailboxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
nameInputFocusNode = FocusNode(); log('DestinationPickerController::onInit():arguments: ${Get.arguments}');
nameInputController = TextEditingController(); arguments = Get.arguments;
searchInputController = TextEditingController();
searchFocus = FocusNode();
searchFocus?.unfocus();
nameInputFocusNode?.unfocus();
} }
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
log('DestinationPickerController::onReady():');
if (arguments != null) { if (arguments != null) {
mailboxAction.value = arguments!.mailboxAction; mailboxAction.value = arguments!.mailboxAction;
mailboxIdSelected = arguments!.mailboxIdSelected; mailboxIdSelected = arguments!.mailboxIdSelected;
@@ -143,7 +135,11 @@ class DestinationPickerController extends BaseMailboxController {
@override @override
void onClose() { void onClose() {
_disposeWidget(); log('DestinationPickerController::onClose():');
nameInputFocusNode.dispose();
nameInputController.dispose();
searchFocus.dispose();
searchInputController.dispose();
destinationListScrollController.dispose(); destinationListScrollController.dispose();
super.onClose(); super.onClose();
} }
@@ -199,7 +195,7 @@ class DestinationPickerController extends BaseMailboxController {
String? getErrorInputNameString(BuildContext context) { String? getErrorInputNameString(BuildContext context) {
final nameMailbox = newNameMailbox.value; final nameMailbox = newNameMailbox.value;
if (nameInputFocusNode?.hasFocus == false && nameMailbox == null) { if (nameInputFocusNode.hasFocus == false && nameMailbox == null) {
return null; return null;
} }
@@ -224,7 +220,7 @@ class DestinationPickerController extends BaseMailboxController {
bool isCreateMailboxValidated(BuildContext context) { bool isCreateMailboxValidated(BuildContext context) {
final nameValidated = getErrorInputNameString(context); final nameValidated = getErrorInputNameString(context);
if (nameInputFocusNode?.hasFocus == false && newNameMailbox.value == null) { if (nameInputFocusNode.hasFocus == false && newNameMailbox.value == null) {
return false; return false;
} }
@@ -265,13 +261,13 @@ class DestinationPickerController extends BaseMailboxController {
listMailboxSearched.clear(); listMailboxSearched.clear();
searchState.value = searchState.value.disableSearchState(); searchState.value = searchState.value.disableSearchState();
searchQuery.value = SearchQuery.initial(); searchQuery.value = SearchQuery.initial();
searchInputController?.clear(); searchInputController.clear();
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
} }
void clearSearchText() { void clearSearchText() {
searchQuery.value = SearchQuery.initial(); searchQuery.value = SearchQuery.initial();
searchFocus?.requestFocus(); searchFocus.requestFocus();
listMailboxSearched.clear(); listMailboxSearched.clear();
} }
@@ -377,12 +373,7 @@ class DestinationPickerController extends BaseMailboxController {
AppLocalizations.of(context).toastMessageErrorNotSelectedFolderWhenCreateNewMailbox); AppLocalizations.of(context).toastMessageErrorNotSelectedFolderWhenCreateNewMailbox);
return; return;
} }
popBack(result: mailboxDestination.value);
if (PlatformInfo.isWeb) {
onSelectedMailboxCallback?.call(mailboxDestination.value);
} else {
popBack(result: mailboxDestination.value);
}
} }
void createNewMailboxAction(BuildContext context) { void createNewMailboxAction(BuildContext context) {
@@ -408,29 +399,13 @@ class DestinationPickerController extends BaseMailboxController {
} }
void backToDestinationScreen(BuildContext context) { void backToDestinationScreen(BuildContext context) {
nameInputController?.clear(); nameInputController.clear();
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
destinationScreenType.value = DestinationScreenType.destinationPicker; destinationScreenType.value = DestinationScreenType.destinationPicker;
} }
void _disposeWidget() {
nameInputFocusNode?.dispose();
nameInputFocusNode = null;
nameInputController?.dispose();
nameInputController = null;
searchFocus?.dispose();
searchFocus = null;
searchInputController?.dispose();
searchInputController = null;
}
void closeDestinationPicker(BuildContext context) { void closeDestinationPicker(BuildContext context) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
popBack();
if (PlatformInfo.isWeb) {
onDismissDestinationPicker?.call();
} else {
popBack();
}
} }
} }
@@ -19,7 +19,6 @@ import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_screen_type.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/destination_picker_search_mailbox_item_builder.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/widgets/top_bar_destination_picker_builder.dart';
@@ -45,20 +44,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
@override @override
final controller = Get.find<DestinationPickerController>(); final controller = Get.find<DestinationPickerController>();
DestinationPickerView({Key? key}) : super(key: key) { DestinationPickerView({super.key});
controller.arguments = Get.arguments;
}
DestinationPickerView.fromArguments(
DestinationPickerArguments arguments, {
Key? key,
OnSelectedMailboxCallback? onSelectedMailboxCallback,
VoidCallback? onDismissCallback
}) : super(key: key) {
controller.arguments = arguments;
controller.onSelectedMailboxCallback = onSelectedMailboxCallback;
controller.onDismissDestinationPicker = onDismissCallback;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -68,6 +68,7 @@ import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/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/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.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/routes/route_utils.dart';
@@ -678,39 +679,23 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
session, session,
mailboxIdSelected: currentMailbox.mailboxId mailboxIdSelected: currentMailbox.mailboxId
); );
if (PlatformInfo.isWeb) {
showDialogDestinationPicker(
context: context,
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
if (mailboxDashBoardController.sessionCurrent != null) {
_dispatchMoveToAction(
context,
accountId,
mailboxDashBoardController.sessionCurrent!,
email,
currentMailbox,
destinationMailbox);
}
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && final destinationMailbox = PlatformInfo.isWeb
? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
: await push(AppRoutes.destinationPicker, arguments: arguments);
if (destinationMailbox != null &&
destinationMailbox is PresentationMailbox && destinationMailbox is PresentationMailbox &&
mailboxDashBoardController.sessionCurrent != null && mailboxDashBoardController.sessionCurrent != null &&
context.mounted context.mounted
) { ) {
_dispatchMoveToAction( _dispatchMoveToAction(
context, context,
accountId, accountId,
mailboxDashBoardController.sessionCurrent!, mailboxDashBoardController.sessionCurrent!,
email, email,
currentMailbox, currentMailbox,
destinationMailbox); destinationMailbox);
}
} }
} }
} }
@@ -1182,25 +1167,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
session, session,
emailAddress: emailAddress); emailAddress: emailAddress);
if (PlatformInfo.isWeb) { final newRuleFilterRequest = PlatformInfo.isWeb
showDialogRuleFilterCreator( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.rulesFilterCreator, arguments: arguments)
context: context, : await push(AppRoutes.rulesFilterCreator, arguments: arguments);
arguments: arguments,
onCreatedRuleFilter: (arguments) {
if (arguments is CreateNewEmailRuleFilterRequest) {
_createNewRuleFilterAction(accountId, arguments);
}
}
);
} else {
final newRuleFilterRequest = await push(
AppRoutes.rulesFilterCreator,
arguments: arguments
);
if (newRuleFilterRequest is CreateNewEmailRuleFilterRequest) { if (newRuleFilterRequest is CreateNewEmailRuleFilterRequest) {
_createNewRuleFilterAction(accountId, newRuleFilterRequest); _createNewRuleFilterAction(accountId, newRuleFilterRequest);
}
} }
} }
} }
@@ -18,8 +18,4 @@ class IdentityCreatorBindings extends Bindings {
Get.find<IdentityUtils>() Get.find<IdentityUtils>()
)); ));
} }
void dispose() {
Get.delete<IdentityCreatorController>();
}
} }
@@ -5,10 +5,7 @@ import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:get/get_core/get_core.dart'; import 'package:get/get.dart';
import 'package:get/get_instance/get_instance.dart';
import 'package:get/get_rx/get_rx.dart';
import 'package:html_editor_enhanced/html_editor.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart';
@@ -40,8 +37,6 @@ import 'package:tmail_ui_user/main/error/capability_validator.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
typedef OnCreatedIdentityCallback = Function(dynamic arguments);
class IdentityCreatorController extends BaseController { class IdentityCreatorController extends BaseController {
final VerifyNameInteractor _verifyNameInteractor; final VerifyNameInteractor _verifyNameInteractor;
@@ -62,13 +57,13 @@ class IdentityCreatorController extends BaseController {
final isDefaultIdentity = RxBool(false); final isDefaultIdentity = RxBool(false);
final isDefaultIdentitySupported = RxBool(false); final isDefaultIdentitySupported = RxBool(false);
late RichTextController keyboardRichTextController; final RichTextController keyboardRichTextController = RichTextController();
late RichTextWebController richTextWebController; final RichTextWebController richTextWebController = RichTextWebController();
late HtmlEditorController signatureHtmlEditorController; final TextEditingController inputNameIdentityController = TextEditingController();
TextEditingController? inputNameIdentityController; final TextEditingController inputBccIdentityController = TextEditingController();
TextEditingController? inputBccIdentityController; final FocusNode inputNameIdentityFocusNode = FocusNode();
FocusNode? inputNameIdentityFocusNode; final FocusNode inputBccIdentityFocusNode = FocusNode();
FocusNode? inputBccIdentityFocusNode; final ScrollController scrollController = ScrollController();
String? _nameIdentity; String? _nameIdentity;
String? _contentHtmlEditor; String? _contentHtmlEditor;
@@ -77,9 +72,6 @@ class IdentityCreatorController extends BaseController {
UserProfile? userProfile; UserProfile? userProfile;
Identity? identity; Identity? identity;
IdentityCreatorArguments? arguments; IdentityCreatorArguments? arguments;
OnCreatedIdentityCallback? onCreatedIdentityCallback;
VoidCallback? onDismissIdentityCreator;
ScrollController? scrollController;
final GlobalKey htmlKey = GlobalKey(); final GlobalKey htmlKey = GlobalKey();
final htmlEditorMinHeight = 160; final htmlEditorMinHeight = 160;
@@ -107,21 +99,15 @@ class IdentityCreatorController extends BaseController {
@override @override
void onInit() { void onInit() {
log('IdentityCreatorController::onInit():');
super.onInit(); super.onInit();
keyboardRichTextController = RichTextController(); log('IdentityCreatorController::onInit():arguments: ${Get.arguments}');
richTextWebController = RichTextWebController(); arguments = Get.arguments;
signatureHtmlEditorController = HtmlEditorController(processNewLineAsBr: true);
inputNameIdentityController = TextEditingController();
inputBccIdentityController = TextEditingController();
inputNameIdentityFocusNode = FocusNode();
inputBccIdentityFocusNode = FocusNode();
scrollController = ScrollController();
} }
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
log('IdentityCreatorController::onReady():');
if (arguments != null) { if (arguments != null) {
accountId = arguments!.accountId; accountId = arguments!.accountId;
session = arguments!.session; session = arguments!.session;
@@ -136,7 +122,14 @@ class IdentityCreatorController extends BaseController {
@override @override
void onClose() { void onClose() {
_disposeWidget(); log('IdentityCreatorController::onClose():');
keyboardRichTextController.dispose();
inputNameIdentityFocusNode.dispose();
inputBccIdentityFocusNode.dispose();
inputNameIdentityController.dispose();
inputBccIdentityController.dispose();
scrollController.dispose();
richTextWebController.onClose();
super.onClose(); super.onClose();
} }
@@ -164,12 +157,12 @@ class IdentityCreatorController extends BaseController {
void _setUpValueFromIdentity() { void _setUpValueFromIdentity() {
_nameIdentity = identity?.name ?? ''; _nameIdentity = identity?.name ?? '';
inputNameIdentityController?.text = identity?.name ?? ''; inputNameIdentityController.text = identity?.name ?? '';
if (identity?.signatureAsString.isNotEmpty == true) { if (identity?.signatureAsString.isNotEmpty == true) {
updateContentHtmlEditor(arguments?.identity?.signatureAsString ?? ''); updateContentHtmlEditor(arguments?.identity?.signatureAsString ?? '');
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
signatureHtmlEditorController.setText(arguments?.identity?.signatureAsString ?? ''); richTextWebController.editorController.setText(arguments?.identity?.signatureAsString ?? '');
} }
} }
} }
@@ -236,7 +229,7 @@ class IdentityCreatorController extends BaseController {
if (identity?.bcc?.isNotEmpty == true) { if (identity?.bcc?.isNotEmpty == true) {
bccOfIdentity.value = identity?.bcc!.first; bccOfIdentity.value = identity?.bcc!.first;
inputBccIdentityController?.text = identity?.bcc!.first.emailAddress ?? ''; inputBccIdentityController.text = identity?.bcc!.first.emailAddress ?? '';
} else { } else {
bccOfIdentity.value = null; bccOfIdentity.value = null;
} }
@@ -297,7 +290,7 @@ class IdentityCreatorController extends BaseController {
Future<String?> _getSignatureHtmlText() async { Future<String?> _getSignatureHtmlText() async {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
return signatureHtmlEditorController.getText(); return richTextWebController.editorController.getText();
} else { } else {
return keyboardRichTextController.htmlEditorApi?.getText(); return keyboardRichTextController.htmlEditorApi?.getText();
} }
@@ -346,25 +339,14 @@ class IdentityCreatorController extends BaseController {
final identityRequest = CreateNewIdentityRequest( final identityRequest = CreateNewIdentityRequest(
generateCreateId, generateCreateId,
newIdentity, newIdentity,
isDefaultIdentity: isDefaultIdentity.value isDefaultIdentity: isDefaultIdentity.value);
); popBack(result: identityRequest);
if (PlatformInfo.isWeb) {
onCreatedIdentityCallback?.call(identityRequest);
} else {
popBack(result: identityRequest);
}
} else { } else {
final identityRequest = EditIdentityRequest( final identityRequest = EditIdentityRequest(
identityId: identity!.id!, identityId: identity!.id!,
identityRequest: newIdentity.toIdentityRequest(), identityRequest: newIdentity.toIdentityRequest(),
isDefaultIdentity: isDefaultIdentity.value); isDefaultIdentity: isDefaultIdentity.value);
popBack(result: identityRequest);
if (PlatformInfo.isWeb) {
onCreatedIdentityCallback?.call(identityRequest);
} else {
popBack(result: identityRequest);
}
} }
} }
@@ -389,7 +371,7 @@ class IdentityCreatorController extends BaseController {
} }
String? _getErrorInputAddressString(BuildContext context, {String? value}) { String? _getErrorInputAddressString(BuildContext context, {String? value}) {
final emailAddress = value ?? inputBccIdentityController?.text ?? ''; final emailAddress = value ?? inputBccIdentityController.text;
if (emailAddress.trim().isEmpty) { if (emailAddress.trim().isEmpty) {
return null; return null;
} }
@@ -434,24 +416,8 @@ class IdentityCreatorController extends BaseController {
} }
void closeView(BuildContext context) { void closeView(BuildContext context) {
if (PlatformInfo.isWeb) { clearFocusEditor(context);
onDismissIdentityCreator?.call(); popBack();
} else {
popBack();
}
}
void _disposeWidget() {
keyboardRichTextController.dispose();
inputNameIdentityFocusNode?.dispose();
inputNameIdentityFocusNode = null;
inputBccIdentityFocusNode?.dispose();
inputBccIdentityFocusNode = null;
inputNameIdentityController?.dispose();
inputNameIdentityController = null;
inputBccIdentityController?.dispose();
inputBccIdentityController = null;
scrollController?.dispose();
} }
void initRichTextForMobile(BuildContext context, HtmlEditorApi editorApi) { void initRichTextForMobile(BuildContext context, HtmlEditorApi editorApi) {
@@ -464,29 +430,27 @@ class IdentityCreatorController extends BaseController {
} }
void _onFocusHTMLEditorOnMobile() async { void _onFocusHTMLEditorOnMobile() async {
inputBccIdentityFocusNode?.unfocus(); inputBccIdentityFocusNode.unfocus();
inputNameIdentityFocusNode?.unfocus(); inputNameIdentityFocusNode.unfocus();
if (scrollController != null) { if (htmlKey.currentContext != null) {
if (htmlKey.currentContext != null) { await Scrollable.ensureVisible(htmlKey.currentContext!);
await Scrollable.ensureVisible(htmlKey.currentContext!);
}
await Future.delayed(const Duration(milliseconds: 500), () {
final offset = scrollController!.position.pixels +
defaultKeyboardToolbarHeight +
htmlEditorMinHeight;
scrollController!.animateTo(
offset,
duration: const Duration(milliseconds: 1),
curve: Curves.linear,
);
});
} }
await Future.delayed(const Duration(milliseconds: 500), () {
final offset = scrollController.position.pixels +
defaultKeyboardToolbarHeight +
htmlEditorMinHeight;
scrollController.animateTo(
offset,
duration: const Duration(milliseconds: 1),
curve: Curves.linear,
);
});
} }
void _onEnterKeyDownOnMobile() { void _onEnterKeyDownOnMobile() {
if (scrollController != null && scrollController!.position.pixels < scrollController!.position.maxScrollExtent) { if (scrollController.position.pixels < scrollController.position.maxScrollExtent) {
scrollController!.animateTo( scrollController.animateTo(
scrollController!.position.pixels + 20, scrollController.position.pixels + 20,
duration: const Duration(milliseconds: 1), duration: const Duration(milliseconds: 1),
curve: Curves.linear, curve: Curves.linear,
); );
@@ -20,7 +20,6 @@ import 'package:rich_text_composer/rich_text_composer.dart';
import 'package:rich_text_composer/views/widgets/rich_text_keyboard_toolbar.dart'; import 'package:rich_text_composer/views/widgets/rich_text_keyboard_toolbar.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/toolbar_rich_text_builder.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/toolbar_rich_text_builder.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_drop_list_field_builder.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_drop_list_field_builder.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_field_no_editable_builder.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_field_no_editable_builder.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_input_field_builder.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_input_field_builder.dart';
@@ -39,20 +38,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
@override @override
final controller = Get.find<IdentityCreatorController>(); final controller = Get.find<IdentityCreatorController>();
IdentityCreatorView({Key? key}) : super(key: key) { IdentityCreatorView({super.key});
controller.arguments = Get.arguments;
}
IdentityCreatorView.fromArguments(
IdentityCreatorArguments arguments, {
Key? key,
OnCreatedIdentityCallback? onCreatedIdentityCallback,
VoidCallback? onDismissCallback
}) : super(key: key) {
controller.arguments = arguments;
controller.onCreatedIdentityCallback = onCreatedIdentityCallback;
controller.onDismissIdentityCreator = onDismissCallback;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -133,27 +119,6 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
)) ))
), ),
), ),
tabletLarge: Scaffold(
backgroundColor: Colors.black38,
body: GestureDetector(
onTap: () => controller.clearFocusEditor(context),
child: Center(child: Card(
color: Colors.transparent,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))),
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(16))),
width: _responsiveUtils.getSizeScreenWidth(context) * 0.85,
height: _responsiveUtils.getSizeScreenHeight(context) * 0.6,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)),
child: _buildBodyMobile(context)
)
)
))
)
),
landscapeTablet: Scaffold( landscapeTablet: Scaffold(
backgroundColor: Colors.black38, backgroundColor: Colors.black38,
body: GestureDetector( body: GestureDetector(
@@ -245,7 +210,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
controller.inputBccIdentityController, controller.inputBccIdentityController,
focusNode: PlatformInfo.isWeb ? null : controller.inputBccIdentityFocusNode, focusNode: PlatformInfo.isWeb ? null : controller.inputBccIdentityFocusNode,
onSelectedSuggestionAction: (newEmailAddress) { onSelectedSuggestionAction: (newEmailAddress) {
controller.inputBccIdentityController?.text = newEmailAddress?.email ?? ''; controller.inputBccIdentityController.text = newEmailAddress?.email ?? '';
controller.updateBccOfIdentity(newEmailAddress); controller.updateBccOfIdentity(newEmailAddress);
}, },
onChangeInputSuggestionAction: (pattern) { onChangeInputSuggestionAction: (pattern) {
@@ -383,8 +348,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
controller.updateContentHtmlEditor(changed); controller.updateContentHtmlEditor(changed);
}, onInit: () { }, onInit: () {
log('IdentityCreatorView::_buildHtmlEditorWeb(): onInit'); log('IdentityCreatorView::_buildHtmlEditorWeb(): onInit');
controller.richTextWebController.editorController.setFullScreen();
controller.updateContentHtmlEditor(initContent); controller.updateContentHtmlEditor(initContent);
controller.richTextWebController.setEnableCodeView();
}, onFocus: () { }, onFocus: () {
log('IdentityCreatorView::_buildHtmlEditorWeb(): onFocus'); log('IdentityCreatorView::_buildHtmlEditorWeb(): onFocus');
FocusManager.instance.primaryFocus?.unfocus(); FocusManager.instance.primaryFocus?.unfocus();
@@ -72,6 +72,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_emai
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/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/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.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/routes/route_utils.dart';
@@ -477,29 +478,16 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
teamMailboxesTree.value, teamMailboxesTree.value,
mailboxDashBoardController.sessionCurrent!); mailboxDashBoardController.sessionCurrent!);
if (PlatformInfo.isWeb) { final result = PlatformInfo.isWeb
showDialogMailboxCreator( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.mailboxCreator, arguments: arguments)
context: context, : await push(AppRoutes.mailboxCreator, arguments: arguments);
arguments: arguments,
onCreatedMailbox: (newMailboxArguments) {
final generateCreateId = Id(_uuid.v1());
_createNewMailboxAction(session, accountId, CreateNewMailboxRequest(
generateCreateId,
newMailboxArguments.newName,
parentId: newMailboxArguments.mailboxLocation?.id));
});
} else {
final newMailboxArguments = await push(
AppRoutes.mailboxCreator,
arguments: arguments);
if (newMailboxArguments != null && newMailboxArguments is NewMailboxArguments) { if (result != null && result is NewMailboxArguments) {
final generateCreateId = Id(_uuid.v1()); final generateCreateId = Id(_uuid.v1());
_createNewMailboxAction(session, accountId, CreateNewMailboxRequest( _createNewMailboxAction(session, accountId, CreateNewMailboxRequest(
generateCreateId, generateCreateId,
newMailboxArguments.newName, result.newName,
parentId: newMailboxArguments.mailboxLocation?.id)); parentId: result.mailboxLocation?.id));
}
} }
} }
} }
@@ -1,33 +1,12 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_controller.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_controller.dart';
class MailboxCreatorBindings extends BaseBindings { class MailboxCreatorBindings extends Bindings {
@override @override
void bindingsController() { void dependencies() {
Get.lazyPut(() => VerifyNameInteractor());
Get.lazyPut(() => MailboxCreatorController(Get.find<VerifyNameInteractor>())); Get.lazyPut(() => MailboxCreatorController(Get.find<VerifyNameInteractor>()));
} }
@override
void bindingsDataSource() {}
@override
void bindingsDataSourceImpl() {}
@override
void bindingsInteractor() {
Get.lazyPut(() => VerifyNameInteractor());
}
@override
void bindingsRepository() {}
@override
void bindingsRepositoryImpl() {}
void dispose() {
Get.delete<MailboxCreatorController>();
}
} }
@@ -19,10 +19,9 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/v
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart';
import 'package:tmail_ui_user/main/routes/app_routes.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
typedef OnCreatedMailboxCallback = Function(NewMailboxArguments? arguments);
class MailboxCreatorController extends BaseController { class MailboxCreatorController extends BaseController {
final VerifyNameInteractor _verifyNameInteractor; final VerifyNameInteractor _verifyNameInteractor;
@@ -31,8 +30,8 @@ class MailboxCreatorController extends BaseController {
final newNameMailbox = Rxn<String>(); final newNameMailbox = Rxn<String>();
bool _createdMailbox = false; bool _createdMailbox = false;
FocusNode? nameInputFocusNode; final FocusNode nameInputFocusNode = FocusNode();
TextEditingController? nameInputController; final TextEditingController nameInputController = TextEditingController();
MailboxCreatorArguments? arguments; MailboxCreatorArguments? arguments;
AccountId? accountId; AccountId? accountId;
@@ -40,8 +39,6 @@ class MailboxCreatorController extends BaseController {
MailboxTree? defaultMailboxTree; MailboxTree? defaultMailboxTree;
MailboxTree? personalMailboxTree; MailboxTree? personalMailboxTree;
MailboxTree? teamMailboxesTre; MailboxTree? teamMailboxesTre;
OnCreatedMailboxCallback? onCreatedMailboxCallback;
VoidCallback? onDismissMailboxCreator;
List<String> listMailboxNameAsStringExist = <String>[]; List<String> listMailboxNameAsStringExist = <String>[];
@@ -52,13 +49,14 @@ class MailboxCreatorController extends BaseController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
nameInputFocusNode = FocusNode(); log('MailboxCreatorController::onInit():arguments: ${Get.arguments}');
nameInputController = TextEditingController(); arguments = Get.arguments;
} }
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
log('MailboxCreatorController::onReady():');
if (arguments != null) { if (arguments != null) {
personalMailboxTree = arguments!.personalMailboxTree; personalMailboxTree = arguments!.personalMailboxTree;
defaultMailboxTree = arguments!.defaultMailboxTree; defaultMailboxTree = arguments!.defaultMailboxTree;
@@ -71,7 +69,9 @@ class MailboxCreatorController extends BaseController {
@override @override
void onClose() { void onClose() {
_disposeWidget(); log('MailboxCreatorController::onClose():');
nameInputFocusNode.dispose();
nameInputController.dispose();
super.onClose(); super.onClose();
} }
@@ -111,7 +111,7 @@ class MailboxCreatorController extends BaseController {
String? getErrorInputNameString(BuildContext context) { String? getErrorInputNameString(BuildContext context) {
final nameMailbox = newNameMailbox.value; final nameMailbox = newNameMailbox.value;
final canCheckNameString = _createdMailbox && nameInputFocusNode?.hasFocus == false; final canCheckNameString = _createdMailbox && nameInputFocusNode.hasFocus == false;
return _verifyNameInteractor.execute( return _verifyNameInteractor.execute(
nameMailbox, nameMailbox,
@@ -138,47 +138,26 @@ class MailboxCreatorController extends BaseController {
if (accountId != null) { if (accountId != null) {
final arguments = DestinationPickerArguments( final arguments = DestinationPickerArguments(
accountId!, accountId!,
MailboxActions.create, MailboxActions.create,
_session, _session,
mailboxIdSelected: selectedMailbox.value?.id); mailboxIdSelected: selectedMailbox.value?.id);
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination; if (destinationMailbox is PresentationMailbox) {
_createListMailboxNameAsStringInMailboxLocation(); final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox
}); ? null
} else { : destinationMailbox;
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) { selectedMailbox.value = mailboxDestination;
final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox _createListMailboxNameAsStringInMailboxLocation();
? null
: destinationMailbox;
selectedMailbox.value = mailboxDestination;
_createListMailboxNameAsStringInMailboxLocation();
}
} }
} }
} }
void _disposeWidget() {
nameInputFocusNode?.dispose();
nameInputFocusNode = null;
nameInputController?.dispose();
nameInputController = null;
}
void createNewMailbox(BuildContext context) { void createNewMailbox(BuildContext context) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
@@ -191,24 +170,14 @@ class MailboxCreatorController extends BaseController {
if (nameMailbox != null && nameMailbox.isNotEmpty && _createdMailbox) { if (nameMailbox != null && nameMailbox.isNotEmpty && _createdMailbox) {
final newMailboxArguments = NewMailboxArguments( final newMailboxArguments = NewMailboxArguments(
MailboxName(nameMailbox), MailboxName(nameMailbox),
mailboxLocation: selectedMailbox.value); mailboxLocation: selectedMailbox.value);
popBack(result: newMailboxArguments);
if (PlatformInfo.isWeb) {
onCreatedMailboxCallback?.call(newMailboxArguments);
} else {
popBack(result: newMailboxArguments);
}
} }
} }
void closeMailboxCreator(BuildContext context) { void closeMailboxCreator(BuildContext context) {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
popBack();
if (PlatformInfo.isWeb) {
onDismissMailboxCreator?.call();
} else {
popBack();
}
} }
} }
@@ -3,6 +3,7 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/text/text_field_builder.dart'; import 'package:core/presentation/views/text/text_field_builder.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart'; import 'package:core/utils/platform_info.dart';
import 'package:core/utils/direction_utils.dart'; import 'package:core/utils/direction_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -11,7 +12,6 @@ import 'package:get/get.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_controller.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_controller.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/app_bar_mailbox_creator_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/app_bar_mailbox_creator_builder.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/create_mailbox_name_input_decoration_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/widgets/create_mailbox_name_input_decoration_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -25,23 +25,11 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
@override @override
final controller = Get.find<MailboxCreatorController>(); final controller = Get.find<MailboxCreatorController>();
MailboxCreatorView({Key? key}) : super(key: key) { MailboxCreatorView({super.key});
controller.arguments = Get.arguments;
}
MailboxCreatorView.fromArguments(
MailboxCreatorArguments arguments, {
Key? key,
OnCreatedMailboxCallback? onCreatedMailboxCallback,
VoidCallback? onDismissCallback
}) : super(key: key) {
controller.arguments = arguments;
controller.onCreatedMailboxCallback = onCreatedMailboxCallback;
controller.onDismissMailboxCreator = onDismissCallback;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
log('MailboxCreatorView::build():');
return PointerInterceptor( return PointerInterceptor(
child: GestureDetector( child: GestureDetector(
onTap: () => controller.closeMailboxCreator(context), onTap: () => controller.closeMailboxCreator(context),
@@ -114,7 +102,6 @@ class MailboxCreatorView extends GetWidget<MailboxCreatorController> {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
child: Obx(() => TextFieldBuilder( child: Obx(() => TextFieldBuilder(
key: const Key('create_mailbox_name_input'),
onTextChange: controller.setNewNameMailbox, onTextChange: controller.setNewNameMailbox,
keyboardType: TextInputType.visiblePassword, keyboardType: TextInputType.visiblePassword,
cursorColor: AppColor.colorTextButton, cursorColor: AppColor.colorTextButton,
@@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/da
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class AdvancedFilterController extends BaseController { class AdvancedFilterController extends BaseController {
@@ -131,30 +132,19 @@ class AdvancedFilterController extends BaseController {
final session = _mailboxDashBoardController.sessionCurrent; final session = _mailboxDashBoardController.sessionCurrent;
if (accountId != null) { if (accountId != null) {
final arguments = DestinationPickerArguments( final arguments = DestinationPickerArguments(
accountId, accountId,
MailboxActions.select, MailboxActions.select,
session, session,
mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id); mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id);
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
_destinationMailboxSelected = destinationMailbox;
final mailboxName = destinationMailbox.name?.name;
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(mailboxName);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
_destinationMailboxSelected = destinationMailbox; _destinationMailboxSelected = destinationMailbox;
final mailboxName = destinationMailbox.name?.name; final mailboxName = destinationMailbox.name?.name;
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(mailboxName); mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(mailboxName);
}
} }
} }
} }
@@ -120,6 +120,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_emai
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/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/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.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/routes/route_utils.dart';
@@ -791,35 +792,22 @@ class MailboxDashBoardController extends ReloadableController {
sessionCurrent, sessionCurrent,
mailboxIdSelected: currentMailbox.mailboxId); mailboxIdSelected: currentMailbox.mailboxId);
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
if (sessionCurrent != null) {
_dispatchMoveToMultipleAction(
accountId.value!,
sessionCurrent!,
listEmails.listEmailIds,
currentMailbox,
destinationMailbox);
}
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && if (destinationMailbox != null &&
destinationMailbox is PresentationMailbox && destinationMailbox is PresentationMailbox &&
sessionCurrent != null) { sessionCurrent != null &&
_dispatchMoveToMultipleAction( accountId.value != null
accountId.value!, ) {
sessionCurrent!, _dispatchMoveToMultipleAction(
listEmails.listEmailIds, accountId.value!,
currentMailbox, sessionCurrent!,
destinationMailbox); listEmails.listEmailIds,
} currentMailbox,
destinationMailbox
);
} }
} }
} }
@@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/manage_accoun
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart';
@@ -88,23 +89,12 @@ class EmailRulesController extends BaseController {
if (accountId != null && session != null) { if (accountId != null && session != null) {
final arguments = RulesFilterCreatorArguments(accountId, session); final arguments = RulesFilterCreatorArguments(accountId, session);
if (PlatformInfo.isWeb) { final newRuleFilterRequest = PlatformInfo.isWeb
showDialogRuleFilterCreator( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.rulesFilterCreator, arguments: arguments)
context: context, : await push(AppRoutes.rulesFilterCreator, arguments: arguments);
arguments: arguments,
onCreatedRuleFilter: (arguments) {
if (arguments is CreateNewEmailRuleFilterRequest) {
_createNewRuleFilterAction(accountId, arguments);
}
});
} else {
final newRuleFilterRequest = await push(
AppRoutes.rulesFilterCreator,
arguments: arguments);
if (newRuleFilterRequest is CreateNewEmailRuleFilterRequest) { if (newRuleFilterRequest is CreateNewEmailRuleFilterRequest) {
_createNewRuleFilterAction(accountId, newRuleFilterRequest); _createNewRuleFilterAction(accountId, newRuleFilterRequest);
}
} }
} }
} }
@@ -140,23 +130,12 @@ class EmailRulesController extends BaseController {
actionType: CreatorActionType.edit, actionType: CreatorActionType.edit,
tMailRule: rule); tMailRule: rule);
if (PlatformInfo.isWeb) { final newRuleFilterRequest = PlatformInfo.isWeb
showDialogRuleFilterCreator( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.rulesFilterCreator, arguments: arguments)
context: context, : await push(AppRoutes.rulesFilterCreator, arguments: arguments);
arguments: arguments,
onCreatedRuleFilter: (arguments) {
if (arguments is EditEmailRuleFilterRequest) {
_editEmailRuleFilterAction(accountId, arguments);
}
});
} else {
final newRuleFilterRequest = await push(
AppRoutes.rulesFilterCreator,
arguments: arguments);
if (newRuleFilterRequest is EditEmailRuleFilterRequest) { if (newRuleFilterRequest is EditEmailRuleFilterRequest) {
_editEmailRuleFilterAction(accountId, newRuleFilterRequest); _editEmailRuleFilterAction(accountId, newRuleFilterRequest);
}
} }
} }
} }
@@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/model/identit
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class IdentitiesController extends BaseController { class IdentitiesController extends BaseController {
@@ -152,27 +153,14 @@ class IdentitiesController extends BaseController {
if (accountId != null && session != null && userProfile != null) { if (accountId != null && session != null && userProfile != null) {
final arguments = IdentityCreatorArguments(accountId, session, userProfile); final arguments = IdentityCreatorArguments(accountId, session, userProfile);
if (PlatformInfo.isWeb) { final newIdentityArguments = PlatformInfo.isWeb
showDialogIdentityCreator( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.identityCreator, arguments: arguments)
context: context, : await push(AppRoutes.identityCreator, arguments: arguments);
arguments: arguments,
onCreatedIdentity: (arguments) {
if (arguments is CreateNewIdentityRequest) {
_createNewIdentityAction(session, accountId, arguments);
} else if (arguments is EditIdentityRequest) {
_editIdentityAction(session, accountId, arguments);
}
});
} else {
final newIdentityArguments = await push(
AppRoutes.identityCreator,
arguments: arguments);
if (newIdentityArguments is CreateNewIdentityRequest) { if (newIdentityArguments is CreateNewIdentityRequest) {
_createNewIdentityAction(session, accountId, newIdentityArguments); _createNewIdentityAction(session, accountId, newIdentityArguments);
} else if (newIdentityArguments is EditIdentityRequest) { } else if (newIdentityArguments is EditIdentityRequest) {
_editIdentityAction(session, accountId, newIdentityArguments); _editIdentityAction(session, accountId, newIdentityArguments);
}
} }
} }
} }
@@ -271,33 +259,20 @@ class IdentitiesController extends BaseController {
final session = _accountDashBoardController.sessionCurrent; final session = _accountDashBoardController.sessionCurrent;
if (accountId != null && session != null && userProfile != null) { if (accountId != null && session != null && userProfile != null) {
final arguments = IdentityCreatorArguments( final arguments = IdentityCreatorArguments(
accountId, accountId,
session, session,
userProfile, userProfile,
identity: identity, identity: identity,
actionType: IdentityActionType.edit); actionType: IdentityActionType.edit);
if (PlatformInfo.isWeb) { final newIdentityArguments = PlatformInfo.isWeb
showDialogIdentityCreator( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.identityCreator, arguments: arguments)
context: context, : await push(AppRoutes.identityCreator, arguments: arguments);
arguments: arguments,
onCreatedIdentity: (arguments) {
if (arguments is CreateNewIdentityRequest) {
_createNewIdentityAction(session, accountId, arguments);
} else if (arguments is EditIdentityRequest) {
_editIdentityAction(session, accountId, arguments);
}
});
} else {
final newIdentityArguments = await push(
AppRoutes.identityCreator,
arguments: arguments);
if (newIdentityArguments is CreateNewIdentityRequest) { if (newIdentityArguments is CreateNewIdentityRequest) {
_createNewIdentityAction(session, accountId, newIdentityArguments); _createNewIdentityAction(session, accountId, newIdentityArguments);
} else if (newIdentityArguments is EditIdentityRequest) { } else if (newIdentityArguments is EditIdentityRequest) {
_editIdentityAction(session, accountId, newIdentityArguments); _editIdentityAction(session, accountId, newIdentityArguments);
}
} }
} }
} }
@@ -79,8 +79,4 @@ class RulesFilterCreatorBindings extends BaseBindings {
Get.find<StateDataSource>(), Get.find<StateDataSource>(),
)); ));
} }
void dispose() {
Get.delete<RulesFilterCreatorController>();
}
} }
@@ -35,10 +35,9 @@ import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/e
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
typedef OnCreatedRuleFilterCallback = Function(dynamic arguments);
class RulesFilterCreatorController extends BaseMailboxController { class RulesFilterCreatorController extends BaseMailboxController {
final _appToast = Get.find<AppToast>(); final _appToast = Get.find<AppToast>();
@@ -56,17 +55,15 @@ class RulesFilterCreatorController extends BaseMailboxController {
final mailboxSelected = Rxn<PresentationMailbox>(); final mailboxSelected = Rxn<PresentationMailbox>();
final actionType = CreatorActionType.create.obs; final actionType = CreatorActionType.create.obs;
TextEditingController? inputRuleNameController; final TextEditingController inputRuleNameController = TextEditingController();
TextEditingController? inputConditionValueController; final TextEditingController inputConditionValueController = TextEditingController();
FocusNode? inputRuleNameFocusNode; final FocusNode inputRuleNameFocusNode = FocusNode();
FocusNode? inputRuleConditionFocusNode; final FocusNode inputRuleConditionFocusNode = FocusNode();
String? _newRuleName; String? _newRuleName;
String? _newRuleConditionValue; String? _newRuleConditionValue;
RulesFilterCreatorArguments? arguments; RulesFilterCreatorArguments? arguments;
OnCreatedRuleFilterCallback? onCreatedRuleFilterCallback;
VoidCallback? onDismissRuleFilterCreator;
AccountId? _accountId; AccountId? _accountId;
Session? _session; Session? _session;
TMailRule? _currentTMailRule; TMailRule? _currentTMailRule;
@@ -82,15 +79,14 @@ class RulesFilterCreatorController extends BaseMailboxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
inputRuleNameController = TextEditingController(); log('RulesFilterCreatorController::onInit():arguments: ${Get.arguments}');
inputConditionValueController = TextEditingController(); arguments = Get.arguments;
inputRuleNameFocusNode = FocusNode();
inputRuleConditionFocusNode = FocusNode();
} }
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
log('RulesFilterCreatorController::onReady():');
if (arguments != null) { if (arguments != null) {
_accountId = arguments!.accountId; _accountId = arguments!.accountId;
_session = arguments!.session; _session = arguments!.session;
@@ -110,7 +106,11 @@ class RulesFilterCreatorController extends BaseMailboxController {
@override @override
void onClose() { void onClose() {
_disposeWidget(); log('RulesFilterCreatorController::onClose():');
inputRuleNameFocusNode.dispose();
inputRuleConditionFocusNode.dispose();
inputRuleNameController.dispose();
inputConditionValueController.dispose();
super.onClose(); super.onClose();
} }
@@ -158,7 +158,7 @@ class RulesFilterCreatorController extends BaseMailboxController {
} }
break; break;
} }
inputRuleNameFocusNode?.requestFocus(); inputRuleNameFocusNode.requestFocus();
} }
void _setValueInputField(TextEditingController? controller, String value) { void _setValueInputField(TextEditingController? controller, String value) {
@@ -219,31 +219,19 @@ class RulesFilterCreatorController extends BaseMailboxController {
void selectMailbox(BuildContext context) async { void selectMailbox(BuildContext context) async {
if (_accountId != null) { if (_accountId != null) {
final arguments = DestinationPickerArguments( final arguments = DestinationPickerArguments(
_accountId!, _accountId!,
MailboxActions.selectForRuleAction, MailboxActions.selectForRuleAction,
_session); _session);
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
mailboxSelected.value = destinationMailbox;
errorRuleActionValue.value = _getErrorStringByInputValue(
context,
mailboxSelected.value?.name?.name);
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox && context.mounted) { if (destinationMailbox is PresentationMailbox && context.mounted) {
mailboxSelected.value = destinationMailbox; mailboxSelected.value = destinationMailbox;
errorRuleActionValue.value = _getErrorStringByInputValue( errorRuleActionValue.value = _getErrorStringByInputValue(
context, context,
mailboxSelected.value?.name?.name); mailboxSelected.value?.name?.name);
}
} }
} }
} }
@@ -254,14 +242,14 @@ class RulesFilterCreatorController extends BaseMailboxController {
final errorName = _getErrorStringByInputValue(context, _newRuleName); final errorName = _getErrorStringByInputValue(context, _newRuleName);
if (errorName?.isNotEmpty == true) { if (errorName?.isNotEmpty == true) {
errorRuleName.value = errorName; errorRuleName.value = errorName;
inputRuleNameFocusNode?.requestFocus(); inputRuleNameFocusNode.requestFocus();
return; return;
} }
final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue); final errorCondition = _getErrorStringByInputValue(context, _newRuleConditionValue);
if (errorCondition?.isNotEmpty == true) { if (errorCondition?.isNotEmpty == true) {
errorRuleConditionValue.value = errorCondition; errorRuleConditionValue.value = errorCondition;
inputRuleConditionFocusNode?.requestFocus(); inputRuleConditionFocusNode.requestFocus();
return; return;
} }
@@ -301,53 +289,15 @@ class RulesFilterCreatorController extends BaseMailboxController {
value: _newRuleConditionValue! value: _newRuleConditionValue!
)); ));
if (actionType.value == CreatorActionType.create) { final ruleFilterRequest =
final ruleFilterRequest = CreateNewEmailRuleFilterRequest( actionType.value == CreatorActionType.create
_listEmailRule ?? [], ? CreateNewEmailRuleFilterRequest(_listEmailRule ?? [], newTMailRule)
newTMailRule); : EditEmailRuleFilterRequest(_listEmailRule?.withIds ?? [], newTMailRule);
popBack(result: ruleFilterRequest);
if (PlatformInfo.isWeb) {
onCreatedRuleFilterCallback?.call(ruleFilterRequest);
} else {
popBack(result: ruleFilterRequest);
}
} else {
final ruleFilterRequest = EditEmailRuleFilterRequest(
_listEmailRule?.withIds ?? [],
newTMailRule);
if (PlatformInfo.isWeb) {
onCreatedRuleFilterCallback?.call(ruleFilterRequest);
} else {
popBack(result: ruleFilterRequest);
}
}
}
void _clearAll() {
inputRuleNameController?.clear();
inputConditionValueController?.clear();
}
void _disposeWidget() {
inputRuleNameFocusNode?.dispose();
inputRuleNameFocusNode = null;
inputRuleConditionFocusNode?.dispose();
inputRuleConditionFocusNode = null;
inputRuleNameController?.dispose();
inputRuleNameController = null;
inputConditionValueController?.dispose();
inputConditionValueController = null;
} }
void closeView(BuildContext context) { void closeView(BuildContext context) {
_clearAll();
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
popBack();
if (PlatformInfo.isWeb) {
onDismissRuleFilterCreator?.call();
} else {
popBack();
}
} }
} }
@@ -8,7 +8,6 @@ import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
import 'package:tmail_ui_user/features/base/widget/drop_down_button_widget.dart'; import 'package:tmail_ui_user/features/base/widget/drop_down_button_widget.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/extensions/rule_condition_extensions.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/extensions/rule_condition_extensions.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/email_rule_filter_action.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/email_rule_filter_action.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_action_bottom_sheet_action_tile_builder.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_action_bottom_sheet_action_tile_builder.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_condition_comparator_bottom_sheet_action_tile_builder.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/widgets/rule_condition_comparator_bottom_sheet_action_tile_builder.dart';
@@ -26,20 +25,7 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
@override @override
final controller = Get.find<RulesFilterCreatorController>(); final controller = Get.find<RulesFilterCreatorController>();
RuleFilterCreatorView({Key? key}) : super(key: key) { RuleFilterCreatorView({super.key});
controller.arguments = Get.arguments;
}
RuleFilterCreatorView.fromArguments(
RulesFilterCreatorArguments arguments, {
Key? key,
OnCreatedRuleFilterCallback? onCreatedRuleFilterCallback,
VoidCallback? onDismissCallback
}) : super(key: key) {
controller.arguments = arguments;
controller.onCreatedRuleFilterCallback = onCreatedRuleFilterCallback;
controller.onDismissRuleFilterCreator = onDismissCallback;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -66,6 +66,7 @@ import 'package:tmail_ui_user/features/thread/presentation/extensions/list_prese
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart'; import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/routes/app_routes.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/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class SearchEmailController extends BaseController class SearchEmailController extends BaseController
@@ -478,41 +479,25 @@ class SearchEmailController extends BaseController
void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async { void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async {
final arguments = DestinationPickerArguments( final arguments = DestinationPickerArguments(
mailboxDashBoardController.accountId.value!, mailboxDashBoardController.accountId.value!,
MailboxActions.select, MailboxActions.select,
mailboxDashBoardController.sessionCurrent, mailboxDashBoardController.sessionCurrent,
mailboxIdSelected: mailbox?.id); mailboxIdSelected: mailbox?.id);
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) {
_updateSimpleSearchFilter(
mailboxOption: Some(mailboxSelected),
beforeOption: const None()
);
_searchEmailAction(context);
}
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox is PresentationMailbox) { if (destinationMailbox is PresentationMailbox) {
final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox; final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox;
if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) { if (mailboxSelected != null && mailbox?.id != mailboxSelected.id) {
_updateSimpleSearchFilter( _updateSimpleSearchFilter(
mailboxOption: Some(mailboxSelected), mailboxOption: Some(mailboxSelected),
beforeOption: const None() beforeOption: const None()
); );
if (context.mounted) { if (context.mounted) {
_searchEmailAction(context); _searchEmailAction(context);
}
} }
} }
} }
@@ -526,29 +511,14 @@ class SearchEmailController extends BaseController
final listContactSelected = simpleSearchFilter.value.getContactApplied(prefixEmailAddress); final listContactSelected = simpleSearchFilter.value.getContactApplied(prefixEmailAddress);
final arguments = ContactArguments(accountId!, session!, listContactSelected); final arguments = ContactArguments(accountId!, session!, listContactSelected);
if (PlatformInfo.isWeb) { final newContact = await push(AppRoutes.contact, arguments: arguments);
showDialogContactView(
context: context,
arguments: arguments,
onSelectedContact: (newContact) {
_dispatchApplyContactAction(
context,
listContactSelected,
prefixEmailAddress,
newContact);
});
} else {
final newContact = await push(
AppRoutes.contact,
arguments: arguments);
if (newContact is EmailAddress && context.mounted) { if (newContact is EmailAddress && context.mounted) {
_dispatchApplyContactAction( _dispatchApplyContactAction(
context, context,
listContactSelected, listContactSelected,
prefixEmailAddress, prefixEmailAddress,
newContact); newContact);
}
} }
} }
} }
@@ -17,7 +17,6 @@ import 'package:model/email/presentation_email.dart';
import 'package:model/email/read_actions.dart'; import 'package:model/email/read_actions.dart';
import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
@@ -27,10 +26,11 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart';
mixin EmailActionController on ViewAsDialogActionMixin { mixin EmailActionController {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>(); final responsiveUtils = Get.find<ResponsiveUtils>();
@@ -131,38 +131,22 @@ mixin EmailActionController on ViewAsDialogActionMixin {
session, session,
mailboxIdSelected: mailboxContain.mailboxId); mailboxIdSelected: mailboxContain.mailboxId);
if (PlatformInfo.isWeb) { final destinationMailbox = PlatformInfo.isWeb
showDialogDestinationPicker( ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
context: context, : await push(AppRoutes.destinationPicker, arguments: arguments);
arguments: arguments,
onSelectedMailbox: (destinationMailbox) {
if (mailboxDashBoardController.sessionCurrent != null) {
_dispatchMoveToAction(
context,
accountId,
mailboxDashBoardController.sessionCurrent!,
email,
mailboxContain,
destinationMailbox);
}
});
} else {
final destinationMailbox = await push(
AppRoutes.destinationPicker,
arguments: arguments);
if (destinationMailbox != null && if (destinationMailbox != null &&
context.mounted && context.mounted &&
destinationMailbox is PresentationMailbox && destinationMailbox is PresentationMailbox &&
mailboxDashBoardController.sessionCurrent != null) { mailboxDashBoardController.sessionCurrent != null
_dispatchMoveToAction( ) {
context, _dispatchMoveToAction(
accountId, context,
mailboxDashBoardController.sessionCurrent!, accountId,
email, mailboxDashBoardController.sessionCurrent!,
mailboxContain, email,
destinationMailbox); mailboxContain,
} destinationMailbox);
} }
} }
} }
+7 -7
View File
@@ -65,6 +65,13 @@ class AppPages {
manage_account_dashboard.loadLibrary, manage_account_dashboard.loadLibrary,
() => manage_account_dashboard.ManageAccountDashBoardView()), () => manage_account_dashboard.ManageAccountDashBoardView()),
binding: ManageAccountDashBoardBindings()), binding: ManageAccountDashBoardBindings()),
GetPage(
name: AppRoutes.contact,
opaque: false,
page: () => DeferredWidget(
contact_view.loadLibrary,
() => contact_view.ContactView()),
binding: ContactBindings()),
unknownRoutePage, unknownRoutePage,
if (PlatformInfo.isMobile) if (PlatformInfo.isMobile)
...[ ...[
@@ -89,13 +96,6 @@ class AppPages {
mailbox_creator.loadLibrary, mailbox_creator.loadLibrary,
() => mailbox_creator.MailboxCreatorView()), () => mailbox_creator.MailboxCreatorView()),
binding: MailboxCreatorBindings()), binding: MailboxCreatorBindings()),
GetPage(
name: AppRoutes.contact,
opaque: false,
page: () => DeferredWidget(
contact_view.loadLibrary,
() => contact_view.ContactView()),
binding: ContactBindings()),
GetPage( GetPage(
name: AppRoutes.rulesFilterCreator, name: AppRoutes.rulesFilterCreator,
opaque: false, opaque: false,
+62
View File
@@ -0,0 +1,62 @@
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_bindings.dart';
import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_view.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_view.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_view.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_view.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
class DialogRouter {
static Future<dynamic> pushGeneralDialog({
required String routeName,
required Object? arguments
}) {
_bindingDI(routeName);
return Get.generalDialog(
routeSettings: RouteSettings(arguments: arguments),
pageBuilder: (_, __, ___) => _generateView(routeName: routeName, arguments: arguments)
);
}
static void _bindingDI(String routeName) {
log('DialogRouter::_bindingDI():routeName: $routeName');
switch(routeName) {
case AppRoutes.mailboxCreator:
MailboxCreatorBindings().dependencies();
break;
case AppRoutes.rulesFilterCreator:
RulesFilterCreatorBindings().dependencies();
break;
case AppRoutes.identityCreator:
IdentityCreatorBindings().dependencies();
break;
case AppRoutes.destinationPicker:
DestinationPickerBindings().dependencies();
break;
}
}
static Widget _generateView({required String routeName, required Object? arguments}) {
log('DialogRouter::_generateView():routeName: $routeName | arguments: $arguments');
switch(routeName) {
case AppRoutes.mailboxCreator:
return MailboxCreatorView();
case AppRoutes.rulesFilterCreator:
return RuleFilterCreatorView();
case AppRoutes.identityCreator:
return IdentityCreatorView();
case AppRoutes.destinationPicker:
return DestinationPickerView();
default:
return const SizedBox.shrink();
}
}
}