diff --git a/core/lib/presentation/state/success.dart b/core/lib/presentation/state/success.dart index e88d408b7..d6061aa83 100644 --- a/core/lib/presentation/state/success.dart +++ b/core/lib/presentation/state/success.dart @@ -4,6 +4,8 @@ abstract class Success with EquatableMixin {} abstract class ViewState extends Success {} +abstract class ViewEvent extends Success {} + class UIState extends ViewState { static final idle = UIState(); diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 5b9d14f49..7326c3e29 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; @@ -8,6 +10,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmapState; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; +import 'package:rxdart/transformers.dart'; import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; @@ -31,6 +34,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_in import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/special_character_validator.dart'; @@ -73,6 +77,8 @@ class MailboxController extends BaseMailboxController { final searchQuery = SearchQuery.initial().obs; final currentSelectMode = SelectMode.INACTIVE.obs; + final _openMailboxEventController = StreamController(); + List allMailboxes = []; TextEditingController searchInputController = TextEditingController(); FocusNode searchFocus = FocusNode(); @@ -123,6 +129,10 @@ class MailboxController extends BaseMailboxController { } }); }); + + _openMailboxEventController.stream.throttleTime(Duration(milliseconds: 800)).listen((event) { + _handleOpenMailbox(event.buildContext, event.presentationMailbox); + }); } @override @@ -246,9 +256,9 @@ class MailboxController extends BaseMailboxController { } } - void openMailbox( - BuildContext context, - PresentationMailbox presentationMailboxSelected + void _handleOpenMailbox( + BuildContext context, + PresentationMailbox presentationMailboxSelected ) { FocusScope.of(context).unfocus(); @@ -260,6 +270,13 @@ class MailboxController extends BaseMailboxController { } } + void openMailbox( + BuildContext context, + PresentationMailbox presentationMailboxSelected + ) { + _openMailboxEventController.add(OpenMailboxViewEvent(context, presentationMailboxSelected)); + } + void _deleteCredential() async { await _deleteCredentialInteractor.execute(); } @@ -594,4 +611,10 @@ class MailboxController extends BaseMailboxController { _clearAllCache(); pushAndPopAll(AppRoutes.LOGIN); } + + @override + void dispose() { + _openMailboxEventController.close(); + super.dispose(); + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/model/open_mailbox_view_event.dart b/lib/features/mailbox/presentation/model/open_mailbox_view_event.dart new file mode 100644 index 000000000..f8300f164 --- /dev/null +++ b/lib/features/mailbox/presentation/model/open_mailbox_view_event.dart @@ -0,0 +1,13 @@ +import 'package:core/presentation/state/success.dart'; +import 'package:flutter/widgets.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; + +class OpenMailboxViewEvent extends ViewEvent { + final BuildContext buildContext; + final PresentationMailbox presentationMailbox; + + OpenMailboxViewEvent(this.buildContext, this.presentationMailbox); + + @override + List get props => [buildContext, presentationMailbox]; +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index c2340e9fb..5552d31e7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -135,6 +135,8 @@ dependencies: pointer_interceptor: 0.9.1 + rxdart: 0.27.3 + dev_dependencies: flutter_test: sdk: flutter