b3ce1f076c
TF-3881 Thread Detail Unsubscribe context menu TF-3881 Thread Detail Update date time format TF-3881 Thread Detail Update sender receiver spacing TF-3881 Thread Detail Add messageId and references to presentation email TF-3881 Thread Detail Filter created email on refresh TF-3881 Thread Detail Fix CI TF-3881 Thread Detail Fix previous action throws out of index TF-3881 Thread Detail Update sender receiver spacing TF-3881 Thread Detail Adjust email actions when expanded TF-3881 Thread Detail Adjust days ago received time TF-3881 Thread Detail Fix debouncer when update setting TF-3881 Thread Detail Adjust days ago received time TF-3881 Thread Detail Adjust email actions when expanded TF-3881 Thread Detail Hide next previous if not in range TF-3881 Thread Detail Arrange more action according to text direction TF-3881 Thread Detail Hide next previous if not in range TF-3881 Thread Detail Fix move email on tablet
113 lines
4.5 KiB
Dart
113 lines
4.5 KiB
Dart
import 'package:core/presentation/state/failure.dart';
|
|
import 'package:core/presentation/state/success.dart';
|
|
import 'package:core/utils/platform_info.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:get/get_instance/get_instance.dart';
|
|
import 'package:get/state_manager.dart';
|
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
|
import 'package:model/email/presentation_email.dart';
|
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
|
|
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_detail_status_state.dart';
|
|
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_detail_status_interactor.dart';
|
|
import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_detail_ui_action.dart';
|
|
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/initialize_thread_detail_manager.dart';
|
|
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/refresh_thread_detail_on_setting_changed.dart';
|
|
import 'package:tmail_ui_user/features/thread_detail/presentation/model/thread_detail_setting_status.dart';
|
|
|
|
class ThreadDetailManager extends BaseController {
|
|
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
|
|
|
final GetThreadDetailStatusInteractor _getThreadDetailStatusInteractor;
|
|
|
|
ThreadDetailManager(this._getThreadDetailStatusInteractor);
|
|
|
|
final availableThreadIds = RxList<ThreadId>();
|
|
final currentMobilePageViewIndex = 0.obs;
|
|
PageController? pageController;
|
|
|
|
final threadDetailSettingStatus = ThreadDetailSettingStatus.loading.obs;
|
|
AppLifecycleListener? appLifecycleListener;
|
|
bool threadDetailWasEnabled = true;
|
|
|
|
bool get isSearchingOnMobile =>
|
|
mailboxDashBoardController.searchController.isSearchEmailRunning &&
|
|
PlatformInfo.isMobile;
|
|
|
|
RxList<PresentationEmail> get currentDisplayedEmails => isSearchingOnMobile
|
|
? mailboxDashBoardController.listResultSearch
|
|
: mailboxDashBoardController.emailsInCurrentMailbox;
|
|
|
|
ThreadId? get currentThreadId =>
|
|
mailboxDashBoardController.selectedEmail.value?.threadId;
|
|
EmailId? get currentEmailId =>
|
|
mailboxDashBoardController.selectedEmail.value?.id;
|
|
|
|
bool get isThreadDetailEnabled =>
|
|
threadDetailSettingStatus.value == ThreadDetailSettingStatus.enabled;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
consumeState(_getThreadDetailStatusInteractor.execute());
|
|
appLifecycleListener = AppLifecycleListener(
|
|
onResume: () {
|
|
if (threadDetailSettingStatus.value == ThreadDetailSettingStatus.loading) {
|
|
return;
|
|
}
|
|
|
|
consumeState(_getThreadDetailStatusInteractor.execute());
|
|
},
|
|
);
|
|
ever(mailboxDashBoardController.threadDetailUIAction, (action) {
|
|
if (action is UpdatedThreadDetailSettingAction) {
|
|
consumeState(_getThreadDetailStatusInteractor.execute());
|
|
}
|
|
// Reset [threadDetailUIAction] to original value
|
|
mailboxDashBoardController.dispatchThreadDetailUIAction(
|
|
ThreadDetailUIAction(),
|
|
);
|
|
});
|
|
ever(
|
|
mailboxDashBoardController.dashboardRoute,
|
|
(route) {
|
|
final selectedEmail = mailboxDashBoardController.selectedEmail.value;
|
|
if (route != DashboardRoutes.threadDetailed || selectedEmail == null) {
|
|
currentMobilePageViewIndex.value = -1;
|
|
pageController?.dispose();
|
|
pageController = null;
|
|
availableThreadIds.clear();
|
|
return;
|
|
}
|
|
|
|
initializeThreadDetailManager(currentDisplayedEmails);
|
|
},
|
|
);
|
|
}
|
|
|
|
@override
|
|
void handleSuccessViewState(Success success) {
|
|
if (success is GetThreadDetailStatusSuccess) {
|
|
threadDetailSettingStatus.value = success.threadDetailEnabled
|
|
? ThreadDetailSettingStatus.enabled
|
|
: ThreadDetailSettingStatus.disabled;
|
|
refreshThreadDetailOnSettingChanged();
|
|
} else if (success is GettingThreadDetailStatus) {
|
|
threadDetailSettingStatus.value = ThreadDetailSettingStatus.loading;
|
|
} else {
|
|
super.handleSuccessViewState(success);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void handleFailureViewState(Failure failure) {
|
|
if (failure is GetThreadDetailStatusFailure) {
|
|
threadDetailSettingStatus.value = ThreadDetailSettingStatus.enabled;
|
|
refreshThreadDetailOnSettingChanged();
|
|
} else {
|
|
super.handleFailureViewState(failure);
|
|
}
|
|
}
|
|
}
|