diff --git a/lib/features/email/presentation/bindings/email_bindings.dart b/lib/features/email/presentation/bindings/email_bindings.dart index bd4482eab..1e4a434bd 100644 --- a/lib/features/email/presentation/bindings/email_bindings.dart +++ b/lib/features/email/presentation/bindings/email_bindings.dart @@ -1,75 +1,31 @@ import 'package:core/core.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; -import 'package:tmail_ui_user/features/base/base_bindings.dart'; -import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart'; -import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart'; -import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; -import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; -import 'package:tmail_ui_user/features/email/data/datasource/print_file_datasource.dart'; -import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; -import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart'; -import 'package:tmail_ui_user/features/email/data/datasource_impl/email_local_storage_datasource_impl.dart'; -import 'package:tmail_ui_user/features/email/data/datasource_impl/email_session_storage_datasource_impl.dart'; -import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; -import 'package:tmail_ui_user/features/email/data/datasource_impl/print_file_datasource_impl.dart'; -import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; -import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; -import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart'; -import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/download_all_attachments_for_web_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/export_all_attachments_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/get_entire_message_as_document_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/get_stored_email_state_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_html_content_from_attachment_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/parse_email_by_blob_id_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/preview_email_from_eml_file_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/print_email_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/get_html_content_from_attachment_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/presentation/bindings/email_interactor_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; -import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart'; -import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; -import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; -import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; -import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.dart'; -import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; -import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart'; -import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart'; -import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart'; -import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart'; -import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; -import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; -import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; -import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; -import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; -import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; -import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; -class EmailBindings extends BaseBindings { +class EmailBindings extends Bindings { final EmailId? currentEmailId; EmailBindings({this.currentEmailId}); String? get tag => currentEmailId?.id.value; - @override - void bindingsController() { + void _bindingsController() { Get.put(SingleEmailController( Get.find(), Get.find(), @@ -91,132 +47,8 @@ class EmailBindings extends BaseBindings { } @override - void bindingsDataSource() { - Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); - } - - @override - void bindingsDataSourceImpl() { - Get.lazyPut(() => MailboxDataSourceImpl( - Get.find(), - Get.find(), - Get.find())); - Get.lazyPut(() => MailboxCacheDataSourceImpl( - Get.find(), - Get.find())); - Get.lazyPut(() => EmailDataSourceImpl( - Get.find(), - Get.find())); - Get.lazyPut(() => HtmlDataSourceImpl( - Get.find(), - Get.find())); - Get.lazyPut(() => StateDataSourceImpl( - Get.find(), - Get.find(), - Get.find() - )); - Get.lazyPut(() => PrintFileDataSourceImpl( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find() - )); - Get.lazyPut(() => EmailHiveCacheDataSourceImpl( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find())); - Get.lazyPut(() => EmailLocalStorageDataSourceImpl( - Get.find(), - Get.find(), - Get.find())); - Get.lazyPut(() => EmailSessionStorageDatasourceImpl( - Get.find(), - Get.find())); - } - - @override - void bindingsInteractor() { - Get.lazyPut(() => GetEmailContentInteractor(Get.find())); - Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find())); - Get.lazyPut(() => DownloadAttachmentsInteractor( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - )); - Get.lazyPut(() => ExportAttachmentInteractor( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - )); - Get.lazyPut(() => MoveToMailboxInteractor(Get.find())); - Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find())); - Get.lazyPut(() => DownloadAttachmentForWebInteractor( - Get.find(), - Get.find(), - Get.find(), - Get.find())); - Get.lazyPut(() => GetStoredEmailStateInteractor(Get.find())); - Get.lazyPut(() => StoreOpenedEmailInteractor(Get.find())); - Get.lazyPut(() => PrintEmailInteractor(Get.find())); - Get.lazyPut(() => ParseEmailByBlobIdInteractor(Get.find())); - Get.lazyPut(() => PreviewEmailFromEmlFileInteractor(Get.find())); - IdentityInteractorsBindings().dependencies(); - Get.lazyPut(() => GetHtmlContentFromAttachmentInteractor(Get.find())); - Get.lazyPut(() => DownloadAllAttachmentsForWebInteractor( - Get.find(), - Get.find(), - Get.find(), - Get.find())); - Get.lazyPut(() => ExportAllAttachmentsInteractor( - Get.find(), - Get.find(), - Get.find(), - Get.find())); - if (PlatformInfo.isIOS) { - Get.lazyPut(() => GetEntireMessageAsDocumentInteractor( - Get.find(), - )); - } - } - - @override - void bindingsRepository() { - Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); - } - - @override - void bindingsRepositoryImpl() { - Get.lazyPut(() => MailboxRepositoryImpl( - { - DataSourceType.network: Get.find(), - DataSourceType.local: Get.find() - }, - Get.find(), - )); - Get.lazyPut(() => EmailRepositoryImpl( - { - DataSourceType.network: Get.find(), - DataSourceType.hiveCache: Get.find(), - DataSourceType.local: Get.find(), - DataSourceType.session: Get.find(), - }, - Get.find(), - Get.find(), - Get.find(), - )); + void dependencies() { + EmailInteractorBindings().dependencies(); + _bindingsController(); } } \ No newline at end of file diff --git a/lib/features/email/presentation/bindings/email_interactor_bindings.dart b/lib/features/email/presentation/bindings/email_interactor_bindings.dart new file mode 100644 index 000000000..5a1674e99 --- /dev/null +++ b/lib/features/email/presentation/bindings/email_interactor_bindings.dart @@ -0,0 +1,192 @@ +import 'package:core/core.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; +import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart'; +import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart'; +import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; +import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; +import 'package:tmail_ui_user/features/email/data/datasource/print_file_datasource.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/email_local_storage_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/email_session_storage_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/print_file_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; +import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; +import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/download_all_attachments_for_web_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/export_all_attachments_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_entire_message_as_document_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_html_content_from_attachment_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/get_stored_email_state_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/parse_email_by_blob_id_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/preview_email_from_eml_file_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/print_email_interactor.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; +import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart'; +import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart'; +import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart'; +import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.dart'; +import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; +import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart'; +import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_interactors_bindings.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_manager.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/new_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; +import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_manager.dart'; +import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; +import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; + +class EmailInteractorBindings extends InteractorsBindings { + + @override + void bindingsDataSource() { + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + } + + @override + void bindingsDataSourceImpl() { + Get.lazyPut(() => MailboxDataSourceImpl( + Get.find(), + Get.find(), + Get.find())); + Get.lazyPut(() => MailboxCacheDataSourceImpl( + Get.find(), + Get.find())); + Get.lazyPut(() => EmailDataSourceImpl( + Get.find(), + Get.find())); + Get.lazyPut(() => HtmlDataSourceImpl( + Get.find(), + Get.find())); + Get.lazyPut(() => StateDataSourceImpl( + Get.find(), + Get.find(), + Get.find() + )); + Get.lazyPut(() => PrintFileDataSourceImpl( + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find() + )); + Get.lazyPut(() => EmailHiveCacheDataSourceImpl( + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find())); + Get.lazyPut(() => EmailLocalStorageDataSourceImpl( + Get.find(), + Get.find(), + Get.find())); + Get.lazyPut(() => EmailSessionStorageDatasourceImpl( + Get.find(), + Get.find())); + } + + @override + void bindingsInteractor() { + Get.lazyPut(() => GetEmailContentInteractor(Get.find())); + Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find())); + Get.lazyPut(() => DownloadAttachmentsInteractor( + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + )); + Get.lazyPut(() => ExportAttachmentInteractor( + Get.find(), + Get.find(), + Get.find(), + Get.find(), + )); + Get.lazyPut(() => MoveToMailboxInteractor(Get.find())); + Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find())); + Get.lazyPut(() => DownloadAttachmentForWebInteractor( + Get.find(), + Get.find(), + Get.find(), + Get.find())); + Get.lazyPut(() => GetStoredEmailStateInteractor(Get.find())); + Get.lazyPut(() => StoreOpenedEmailInteractor(Get.find())); + Get.lazyPut(() => PrintEmailInteractor(Get.find())); + Get.lazyPut(() => ParseEmailByBlobIdInteractor(Get.find())); + Get.lazyPut(() => PreviewEmailFromEmlFileInteractor(Get.find())); + IdentityInteractorsBindings().dependencies(); + Get.lazyPut(() => GetHtmlContentFromAttachmentInteractor(Get.find())); + Get.lazyPut(() => DownloadAllAttachmentsForWebInteractor( + Get.find(), + Get.find(), + Get.find(), + Get.find())); + Get.lazyPut(() => ExportAllAttachmentsInteractor( + Get.find(), + Get.find(), + Get.find(), + Get.find())); + if (PlatformInfo.isIOS) { + Get.lazyPut(() => GetEntireMessageAsDocumentInteractor( + Get.find(), + )); + } + } + + @override + void bindingsRepository() { + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + } + + @override + void bindingsRepositoryImpl() { + Get.lazyPut(() => MailboxRepositoryImpl( + { + DataSourceType.network: Get.find(), + DataSourceType.local: Get.find() + }, + Get.find(), + )); + Get.lazyPut(() => EmailRepositoryImpl( + { + DataSourceType.network: Get.find(), + DataSourceType.hiveCache: Get.find(), + DataSourceType.local: Get.find(), + DataSourceType.session: Get.find(), + }, + Get.find(), + Get.find(), + Get.find(), + )); + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 3a6f8c8d2..9a104d90d 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -37,7 +37,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/restore_deleted_message_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart'; -import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart'; +import 'package:tmail_ui_user/features/email/presentation/bindings/email_interactor_bindings.dart'; import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart'; import 'package:tmail_ui_user/features/home/domain/usecases/store_session_interactor.dart'; import 'package:tmail_ui_user/features/identity_creator/data/datasource/identity_creator_data_source.dart'; @@ -155,7 +155,7 @@ class MailboxDashBoardBindings extends BaseBindings { SendingQueueBindings().dependencies(); MailboxBindings().dependencies(); ThreadBindings().dependencies(); - EmailBindings().dependencies(); + EmailInteractorBindings().dependencies(); SearchEmailBindings().dependencies(); QuotasBindings().dependencies(); ThreadDetailBindings().dependencies(); diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart index a5d80d75e..b0be5ccd7 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:focus_detector_v2/focus_detector_v2.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/email/presentation/email_view.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_empty_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_view.dart'; @@ -38,7 +39,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { case DashboardRoutes.thread: return buildResponsiveWithDrawer( left: ThreadView(), - right: const EmailView(), + right: const EmailViewEmptyWidget(), mobile: buildScaffoldHaveDrawer(body: ThreadView()), ); diff --git a/lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart b/lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart index b9d1ebb5d..0b11fa299 100644 --- a/lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart +++ b/lib/features/thread_detail/presentation/extension/get_thread_details_email_views.dart @@ -7,7 +7,7 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/extension/load import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_on_email_action_click.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_open_email_address_detail_action.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_load_more_segments.dart'; -import 'package:tmail_ui_user/features/thread_detail/presentation/extension/toggle_thread_detail_collape_expand.dart'; +import 'package:tmail_ui_user/features/thread_detail/presentation/extension/toggle_thread_detail_collapse_expand.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/widgets/thread_detail_collapsed_email.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/widgets/thread_detail_load_more_circle.dart'; @@ -61,7 +61,7 @@ extension GetThreadDetailEmailViews on ThreadDetailController { openEmailAddressDetailAction(emailAddress); }, onToggleThreadDetailCollapseExpand: () { - toggleThreadDetailCollapeExpand(presentationEmail); + toggleThreadDetailCollapseExpand(presentationEmail); }, ); } @@ -78,7 +78,7 @@ extension GetThreadDetailEmailViews on ThreadDetailController { isFirstEmailInThreadDetail: true, threadSubject: emailIdsPresentation.values.last?.subject, onToggleThreadDetailCollapseExpand: () { - toggleThreadDetailCollapeExpand(presentationEmail); + toggleThreadDetailCollapseExpand(presentationEmail); }, scrollController: scrollController, ), @@ -94,7 +94,7 @@ extension GetThreadDetailEmailViews on ThreadDetailController { isInsideThreadDetailView: true, emailId: presentationEmail.id, onToggleThreadDetailCollapseExpand: () { - toggleThreadDetailCollapeExpand(presentationEmail); + toggleThreadDetailCollapseExpand(presentationEmail); }, scrollController: scrollController, ), diff --git a/lib/features/thread_detail/presentation/extension/handle_mark_multiple_emails_read_success.dart b/lib/features/thread_detail/presentation/extension/handle_mark_multiple_emails_read_success.dart index 8ad63a528..b1862a14e 100644 --- a/lib/features/thread_detail/presentation/extension/handle_mark_multiple_emails_read_success.dart +++ b/lib/features/thread_detail/presentation/extension/handle_mark_multiple_emails_read_success.dart @@ -3,7 +3,7 @@ import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/extension/close_thread_detail_action.dart'; -import 'package:tmail_ui_user/features/thread_detail/presentation/extension/toggle_thread_detail_collape_expand.dart'; +import 'package:tmail_ui_user/features/thread_detail/presentation/extension/toggle_thread_detail_collapse_expand.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -26,7 +26,7 @@ extension HandleMarkMultipleEmailsReadSuccess on ThreadDetailController { final expandedEmail = emailIdsPresentation[expandedEmailId]; if (emailIds.contains(expandedEmailId) && expandedEmail != null) { - toggleThreadDetailCollapeExpand(expandedEmail); + toggleThreadDetailCollapseExpand(expandedEmail); } } } \ No newline at end of file diff --git a/lib/features/thread_detail/presentation/extension/initialize_thread_detail_manager.dart b/lib/features/thread_detail/presentation/extension/initialize_thread_detail_manager.dart index a0aae0fd3..516a0270c 100644 --- a/lib/features/thread_detail/presentation/extension/initialize_thread_detail_manager.dart +++ b/lib/features/thread_detail/presentation/extension/initialize_thread_detail_manager.dart @@ -1,34 +1,38 @@ +import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:model/email/presentation_email.dart'; +import 'package:model/extensions/list_presentation_email_extension.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_manager.dart'; extension InitializeThreadDetailManager on ThreadDetailManager { void initializeThreadDetailManager( List currentDisplayedEmails, + PresentationEmail? selectedEmail, ) { - availableThreadIds.value = currentDisplayedEmails - .map((presentationEmail) => presentationEmail.threadId) - .toSet() - .nonNulls - .toList(); - if (availableThreadIds.isEmpty) return; + if (PlatformInfo.isMobile) { + final currentThreadId = selectedEmail?.threadId; + final currentEmailId = selectedEmail?.id; - final selectedEmail = mailboxDashBoardController.selectedEmail.value; - if (isThreadDetailEnabled && selectedEmail?.threadId != null) { - final currentThreadIndex = availableThreadIds.indexOf( - selectedEmail!.threadId!, - ); - currentMobilePageViewIndex.value = currentThreadIndex; - } else if (selectedEmail?.id != null) { - final currentEmailIndex = currentDisplayedEmails - .map((email) => email.id) - .toList() - .indexOf(selectedEmail?.id); - currentMobilePageViewIndex.value = currentEmailIndex; + if ((isThreadDetailEnabled && currentThreadId == null) || + (!isThreadDetailEnabled && currentEmailId == null)) { + return; + } + + int currentPageIndex = 0; + + if (isThreadDetailEnabled && currentThreadId != null) { + final uniqueThreadIds = currentDisplayedEmails.uniqueThreadIds; + availableThreadIds.value = uniqueThreadIds; + currentPageIndex = uniqueThreadIds.indexOf(currentThreadId); + } else if (currentEmailId != null) { + currentPageIndex = + currentDisplayedEmails.listEmailIds.indexOf(currentEmailId); + } + + pageController ??= PageController(initialPage: currentPageIndex); + currentMobilePageViewIndex.value = currentPageIndex; + } else { + availableThreadIds.value = currentDisplayedEmails.uniqueThreadIds; } - - pageController ??= PageController( - initialPage: currentMobilePageViewIndex.value, - ); } } \ No newline at end of file diff --git a/lib/features/thread_detail/presentation/extension/on_thread_page_changed.dart b/lib/features/thread_detail/presentation/extension/on_thread_page_changed.dart index 4679af366..75dadf095 100644 --- a/lib/features/thread_detail/presentation/extension/on_thread_page_changed.dart +++ b/lib/features/thread_detail/presentation/extension/on_thread_page_changed.dart @@ -19,7 +19,7 @@ extension OnThreadPageChanged on ThreadDetailController { PlatformInfo.isWeb && threadDetailManager.previousAvailable; void onNext() { - if (currentExpandedEmailId.value != null) { + if (PlatformInfo.isWeb && currentExpandedEmailId.value != null) { mailboxDashBoardController.dispatchEmailUIAction( CollapseEmailInThreadDetailAction(currentExpandedEmailId.value!), ); @@ -29,11 +29,6 @@ extension OnThreadPageChanged on ThreadDetailController { } void onNextMobile() { - if (currentExpandedEmailId.value != null) { - mailboxDashBoardController.dispatchEmailUIAction( - CollapseEmailInThreadDetailAction(currentExpandedEmailId.value!), - ); - } loadThreadOnThreadChanged = isThreadDetailEnabled; threadDetailManager.pageController?.nextPage( duration: const Duration(milliseconds: 500), @@ -42,7 +37,7 @@ extension OnThreadPageChanged on ThreadDetailController { } void onPrevious() { - if (currentExpandedEmailId.value != null) { + if (PlatformInfo.isWeb && currentExpandedEmailId.value != null) { mailboxDashBoardController.dispatchEmailUIAction( CollapseEmailInThreadDetailAction(currentExpandedEmailId.value!), ); @@ -52,11 +47,6 @@ extension OnThreadPageChanged on ThreadDetailController { } void onPreviousMobile() { - if (currentExpandedEmailId.value != null) { - mailboxDashBoardController.dispatchEmailUIAction( - CollapseEmailInThreadDetailAction(currentExpandedEmailId.value!), - ); - } loadThreadOnThreadChanged = isThreadDetailEnabled; threadDetailManager.pageController?.previousPage( duration: const Duration(milliseconds: 500), diff --git a/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart b/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart index 3b0c6d408..8a9d3f730 100644 --- a/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart +++ b/lib/features/thread_detail/presentation/extension/thread_detail_on_selected_email_updated.dart @@ -1,3 +1,4 @@ +import 'package:core/utils/platform_info.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/widgets.dart'; import 'package:model/email/presentation_email.dart'; @@ -50,11 +51,14 @@ extension ThreadDetailOnSelectedEmailUpdated on ThreadDetailController { return; } - mailboxDashBoardController.dispatchEmailUIAction( - DisposePreviousExpandedEmailAction( - currentExpandedEmailId.value!, - ), - ); + if (PlatformInfo.isWeb) { + mailboxDashBoardController.dispatchEmailUIAction( + DisposePreviousExpandedEmailAction( + currentExpandedEmailId.value!, + ), + ); + } + loadThreadOnThreadChanged = isThreadDetailEnabled; _preloadSelectedEmail(selectedEmail); } diff --git a/lib/features/thread_detail/presentation/extension/toggle_thread_detail_collape_expand.dart b/lib/features/thread_detail/presentation/extension/toggle_thread_detail_collapse_expand.dart similarity index 78% rename from lib/features/thread_detail/presentation/extension/toggle_thread_detail_collape_expand.dart rename to lib/features/thread_detail/presentation/extension/toggle_thread_detail_collapse_expand.dart index f029a3369..7f89a1411 100644 --- a/lib/features/thread_detail/presentation/extension/toggle_thread_detail_collape_expand.dart +++ b/lib/features/thread_detail/presentation/extension/toggle_thread_detail_collapse_expand.dart @@ -1,11 +1,12 @@ +import 'package:core/utils/platform_info.dart'; import 'package:model/email/presentation_email.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart'; import 'package:model/email/email_in_thread_status.dart'; import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart'; -extension ToggleThreadDetailCollapeExpand on ThreadDetailController { - void toggleThreadDetailCollapeExpand(PresentationEmail presentationEmail) { +extension ToggleThreadDetailCollapseExpand on ThreadDetailController { + void toggleThreadDetailCollapseExpand(PresentationEmail presentationEmail) { final emailId = presentationEmail.id; final expansionStatus = presentationEmail.emailInThreadStatus; if (emailId == null || expansionStatus == null) return; @@ -16,9 +17,11 @@ extension ToggleThreadDetailCollapeExpand on ThreadDetailController { emailIdsPresentation[emailId] = presentationEmail.copyWith( emailInThreadStatus: EmailInThreadStatus.collapsed, ); - mailboxDashBoardController.dispatchEmailUIAction( - CollapseEmailInThreadDetailAction(emailId), - ); + if (PlatformInfo.isWeb) { + mailboxDashBoardController.dispatchEmailUIAction( + CollapseEmailInThreadDetailAction(emailId), + ); + } currentExpandedEmailId.value = null; threadDetailManager.currentMobilePageViewIndex.refresh(); return; @@ -40,9 +43,11 @@ extension ToggleThreadDetailCollapeExpand on ThreadDetailController { emailIdsPresentation[key] = emailIdsPresentation[key]?.copyWith( emailInThreadStatus: EmailInThreadStatus.collapsed, ); - mailboxDashBoardController.dispatchEmailUIAction( - CollapseEmailInThreadDetailAction(key), - ); + if (PlatformInfo.isWeb) { + mailboxDashBoardController.dispatchEmailUIAction( + CollapseEmailInThreadDetailAction(key), + ); + } } } threadDetailManager.currentMobilePageViewIndex.refresh(); diff --git a/lib/features/thread_detail/presentation/thread_detail_manager.dart b/lib/features/thread_detail/presentation/thread_detail_manager.dart index 740a72445..7ca4e0133 100644 --- a/lib/features/thread_detail/presentation/thread_detail_manager.dart +++ b/lib/features/thread_detail/presentation/thread_detail_manager.dart @@ -82,7 +82,10 @@ class ThreadDetailManager extends ReloadableController { return; } - initializeThreadDetailManager(currentDisplayedEmails); + initializeThreadDetailManager( + currentDisplayedEmails, + selectedEmail, + ); }, ); } diff --git a/model/lib/extensions/list_presentation_email_extension.dart b/model/lib/extensions/list_presentation_email_extension.dart index 36041c7c2..5eb8726c0 100644 --- a/model/lib/extensions/list_presentation_email_extension.dart +++ b/model/lib/extensions/list_presentation_email_extension.dart @@ -25,6 +25,9 @@ extension ListPresentationEmailExtension on List { List get listEmailIds => map((email) => email.id).nonNulls.toList(); + List get uniqueThreadIds => + map((email) => email.threadId).toSet().nonNulls.toList(); + Map> get emailIdsByMailboxId { final Map> result = {}; for (final email in this) {