Skip to content

TF-3699 Thread Detail Next previous actions #3843

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: feature/TF-3731-Thread-Detail-Cache-web
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,7 @@ class HtmlContentViewState extends State<HtmlContentViewer> with AutomaticKeepAl
void dispose() {
_loadingBarNotifier.dispose();
_htmlData = null;
_webViewController.dispose();
super.dispose();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,20 @@ class GettingThreadById extends LoadingState {
class GetThreadByIdSuccess extends UIState {
final List<EmailId> emailIds;
final bool updateCurrentThreadDetail;
final bool skipLoadingMetadata;

GetThreadByIdSuccess(this.emailIds, {this.updateCurrentThreadDetail = false});
GetThreadByIdSuccess(
this.emailIds, {
this.updateCurrentThreadDetail = false,
this.skipLoadingMetadata = false,
});

@override
List<Object> get props => [emailIds, updateCurrentThreadDetail];
List<Object> get props => [
emailIds,
updateCurrentThreadDetail,
skipLoadingMetadata,
];
}

class GetThreadByIdFailure extends FeatureFailure {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ extension GetThreadDetailLoadingView on ThreadDetailController {
alignment: Alignment.center,
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(20)),
borderRadius: BorderRadius.vertical(bottom: Radius.circular(20)),
),
margin: isResponsiveDesktop
? const EdgeInsetsDirectional.only(end: 16)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/utils/thread_d

extension InitializeThreadDetailEmails on ThreadDetailController {
void initializeThreadDetailEmails(GetThreadByIdSuccess success) {
if (success.skipLoadingMetadata) return;

final threadDetailEnabled = isThreadDetailEnabled;
final selectedEmail = mailboxDashBoardController.selectedEmail.value;
if (!threadDetailEnabled &&
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'package:core/utils/platform_info.dart';
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/thread_detail_next_previous_actions.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';

extension OnThreadPageChanged on ThreadDetailController {
void onThreadPageChanged(int index) {
if (index > threadDetailManager.currentMobilePageViewIndex.value) {
onNext();
} else if (index < threadDetailManager.currentMobilePageViewIndex.value) {
onPrevious();
}
}

bool get nextAvailable =>
PlatformInfo.isWeb && threadDetailManager.nextAvailable;
bool get previousAvailable =>
PlatformInfo.isWeb && threadDetailManager.previousAvailable;

void onNext() {
if (currentExpandedEmailId.value != null) {
mailboxDashBoardController.dispatchEmailUIAction(
CollapseEmailInThreadDetailAction(currentExpandedEmailId.value!),
);
}
threadDetailManager.onNext();
}

void onPrevious() {
if (currentExpandedEmailId.value != null) {
mailboxDashBoardController.dispatchEmailUIAction(
CollapseEmailInThreadDetailAction(currentExpandedEmailId.value!),
);
}
threadDetailManager.onPrevious();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_manager.dart';

extension RefreshThreadDetailOnSettingChanged on ThreadDetailController {
extension RefreshThreadDetailOnSettingChanged on ThreadDetailManager {
void refreshThreadDetailOnSettingChanged() {
if (threadDetailWasEnabled != isThreadDetailEnabled) {
threadDetailWasEnabled = isThreadDetailEnabled;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import 'package:collection/collection.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/widgets.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_manager.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';

extension ThreadDetailNextPreviousActions on ThreadDetailManager {
bool get nextAvailable => isThreadDetailEnabled
? currentThreadId != availableThreadIds.lastOrNull
: currentEmailId != currentDisplayedEmails.lastOrNull?.id;
void onNext() {
if (!nextAvailable) return;

final currentIndex = isThreadDetailEnabled
? availableThreadIds.indexOf(currentThreadId!)
: currentDisplayedEmails
.indexOf(mailboxDashBoardController.selectedEmail.value!);
_navigate(currentIndex + 1, isThreadDetailEnabled);
}

bool get previousAvailable => isThreadDetailEnabled
? currentThreadId != availableThreadIds.firstOrNull
: currentEmailId != currentDisplayedEmails.firstOrNull?.id;
void onPrevious() {
if (!previousAvailable) return;

final currentIndex = isThreadDetailEnabled
? availableThreadIds.indexOf(currentThreadId!)
: currentDisplayedEmails
.indexOf(mailboxDashBoardController.selectedEmail.value!);
_navigate(currentIndex - 1, isThreadDetailEnabled);
}

void _preparePageWithIndex(int index) {
currentMobilePageViewIndex.value = index;
pageController?.dispose();
pageController = PageController(initialPage: index);
}

void _goToPageWithEmail(PresentationEmail? presentationEmail) {
mailboxDashBoardController.setSelectedEmail(presentationEmail);
if (PlatformInfo.isWeb && presentationEmail?.routeWeb != null) {
RouteUtils.replaceBrowserHistory(
title: 'Email-${presentationEmail?.id?.id.value ?? ''}',
url: presentationEmail!.routeWeb!);
}
}

void _navigateToEmail(int emailIndex) {
final email = currentDisplayedEmails[emailIndex];
_preparePageWithIndex(emailIndex);
_goToPageWithEmail(email);
}

void _navigateToThread(int threadIndex) {
final threadId = availableThreadIds[threadIndex];
final email = currentDisplayedEmails.firstWhereOrNull(
(presentationEmail) => presentationEmail.threadId == threadId,
);
_preparePageWithIndex(threadIndex);
_goToPageWithEmail(email);
}

void _navigate(int index, bool isThreadDetailEnabled) {
isThreadDetailEnabled ? _navigateToThread(index) : _navigateToEmail(index);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ extension ToggleThreadDetailCollapeExpand on ThreadDetailController {
CollapseEmailInThreadDetailAction(emailId),
);
currentExpandedEmailId.value = null;
threadDetailManager.currentMobilePageViewIndex.refresh();
return;
}

Expand All @@ -42,5 +43,6 @@ extension ToggleThreadDetailCollapeExpand on ThreadDetailController {
);
}
}
threadDetailManager.currentMobilePageViewIndex.refresh();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_emails_
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_by_id_interactor.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/thread_detail_controller.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_manager.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';

Expand All @@ -31,8 +32,10 @@ class ThreadDetailBindings extends BaseBindings {

@override
void bindingsController() {
Get.put(ThreadDetailController(
Get.put(ThreadDetailManager(
Get.find<GetThreadDetailStatusInteractor>(),
));
Get.put(ThreadDetailController(
Get.find<GetThreadByIdInteractor>(),
Get.find<GetEmailsByIdsInteractor>(),
Get.find<MarkAsEmailReadInteractor>(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,17 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new
import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_thread_by_id_state.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/state/get_emails_by_ids_state.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_by_id_interactor.dart';
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_emails_by_ids_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/domain/usecases/get_thread_detail_status_interactor.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/handle_email_moved_action.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_email_ids_by_thread_id_success.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_emails_by_ids_success.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_get_thread_by_id_failure.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/handle_refresh_thread_detail_action.dart';
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/initialize_thread_detail_emails.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';
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_manager.dart';
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/features/thread_detail/presentation/extension/handle_collapsed_email_download_states.dart';
Expand All @@ -58,7 +55,6 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/extension/mark
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/quick_create_rule_from_collapsed_email_success.dart';

class ThreadDetailController extends BaseController {
final GetThreadDetailStatusInteractor _getThreadDetailStatusInteractor;
final GetThreadByIdInteractor _getEmailIdsByThreadIdInteractor;
final GetEmailsByIdsInteractor getEmailsByIdsInteractor;
final MarkAsEmailReadInteractor _markAsEmailReadInteractor;
Expand All @@ -68,7 +64,6 @@ class ThreadDetailController extends BaseController {
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;

ThreadDetailController(
this._getThreadDetailStatusInteractor,
this._getEmailIdsByThreadIdInteractor,
this.getEmailsByIdsInteractor,
this._markAsEmailReadInteractor,
Expand All @@ -91,14 +86,12 @@ class ThreadDetailController extends BaseController {

final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final searchEmailController = Get.find<SearchEmailController>();
final threadDetailManager = Get.find<ThreadDetailManager>();
final downloadManager = Get.find<DownloadManager>();
final downloadProgressState = StreamController<Either<Failure, Success>>();

ScrollController? scrollController;
CreateNewEmailRuleFilterInteractor? _createNewEmailRuleFilterInteractor;
AppLifecycleListener? appLifecycleListener;
ThreadDetailSettingStatus threadDetailSettingStatus = ThreadDetailSettingStatus.loading;
bool threadDetailWasEnabled = true;

AccountId? get accountId => mailboxDashBoardController.accountId.value;
Session? get session => mailboxDashBoardController.sessionCurrent;
Expand All @@ -116,21 +109,11 @@ class ThreadDetailController extends BaseController {
return isWebSearchRunning || isMobileSearchRunning;
}
bool get isThreadDetailEnabled =>
threadDetailSettingStatus == ThreadDetailSettingStatus.enabled;
threadDetailManager.isThreadDetailEnabled;

@override
void onInit() {
super.onInit();
consumeState(_getThreadDetailStatusInteractor.execute());
appLifecycleListener = AppLifecycleListener(
onResume: () {
if (threadDetailSettingStatus == ThreadDetailSettingStatus.loading) {
return;
}

consumeState(_getThreadDetailStatusInteractor.execute());
},
);
ever(mailboxDashBoardController.accountId, (accountId) {
if (accountId == null) return;

Expand Down Expand Up @@ -188,8 +171,6 @@ class ThreadDetailController extends BaseController {
})
..listUnsubscribeHeader?.clear();
}
} else if (action is UpdatedThreadDetailSettingAction) {
consumeState(_getThreadDetailStatusInteractor.execute());
} else if (action is EmailMovedAction) {
handleEmailMovedAction(action);
}
Expand Down Expand Up @@ -233,13 +214,6 @@ class ThreadDetailController extends BaseController {
quickCreateRuleFromCollapsedEmailSuccess(success);
} else if (success is DownloadAttachmentForWebSuccess) {
handleDownloadSuccess(success);
} else if (success is GetThreadDetailStatusSuccess) {
threadDetailSettingStatus = success.threadDetailEnabled
? ThreadDetailSettingStatus.enabled
: ThreadDetailSettingStatus.disabled;
refreshThreadDetailOnSettingChanged();
} else if (success is GettingThreadDetailStatus) {
threadDetailSettingStatus = ThreadDetailSettingStatus.loading;
} else {
super.handleSuccessViewState(success);
}
Expand All @@ -259,10 +233,6 @@ class ThreadDetailController extends BaseController {
handleDownloadFailure(failure);
return;
}
if (failure is GetThreadDetailStatusFailure) {
threadDetailSettingStatus = ThreadDetailSettingStatus.enabled;
refreshThreadDetailOnSettingChanged();
}
if (failure is PrintEmailFailure) {
if (currentOverlayContext != null && currentContext != null) {
appToast.showToastErrorMessage(
Expand Down
Loading
Loading