Files
workavia-mail-front/lib/features/thread_detail/presentation/thread_detail_manager.dart
T
DatDang b3ce1f076c TF-3881 Thread Detail Bottom sheet close when action
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
2025-07-21 05:34:53 +07:00

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);
}
}
}