hotfix: Email content broken when restore app from background then swipe to next/previous email on tablet

This commit is contained in:
dab246
2025-09-25 15:29:47 +07:00
committed by Dat H. Pham
parent 24095dc147
commit 9d79748362
12 changed files with 266 additions and 232 deletions
@@ -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,
),
@@ -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);
}
}
}
@@ -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<PresentationEmail> 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,
);
}
}
@@ -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),
@@ -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);
}
@@ -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();
@@ -82,7 +82,10 @@ class ThreadDetailManager extends ReloadableController {
return;
}
initializeThreadDetailManager(currentDisplayedEmails);
initializeThreadDetailManager(
currentDisplayedEmails,
selectedEmail,
);
},
);
}