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
This commit is contained in:
+17
-1
@@ -6,6 +6,7 @@ import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/extensions/keyword_identifier_extension.dart';
|
||||
import 'package:model/extensions/list_email_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/extensions/email_extension.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_by_id_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/domain/usecases/get_thread_by_id_interactor.dart';
|
||||
@@ -45,7 +46,10 @@ extension HandleRefreshThreadDetailAction on ThreadDetailController {
|
||||
action.emailChangeResponse.destroyed ?? const []);
|
||||
|
||||
final emailsCreated = action.emailChangeResponse.created
|
||||
?.where((email) => email.threadId == currentThreadId)
|
||||
?.where((email) => validateNewCreatedEmailForCurrentThread(
|
||||
email,
|
||||
currentThreadId,
|
||||
))
|
||||
.map((email) => email.toPresentationEmail().copyWith(
|
||||
emailInThreadStatus: EmailInThreadStatus.collapsed,
|
||||
))
|
||||
@@ -95,4 +99,16 @@ extension HandleRefreshThreadDetailAction on ThreadDetailController {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
bool validateNewCreatedEmailForCurrentThread(
|
||||
Email email,
|
||||
ThreadId currentThreadId,
|
||||
) {
|
||||
return email.threadId == currentThreadId &&
|
||||
sentMailboxId != null &&
|
||||
!email.inSentMailbox(sentMailboxId!) &&
|
||||
ownEmailAddress != null &&
|
||||
!email.fromMe(ownEmailAddress!) &&
|
||||
!email.recipientsHasMe(ownEmailAddress!);
|
||||
}
|
||||
}
|
||||
+7
-5
@@ -7,8 +7,8 @@ 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;
|
||||
? currentThreadId != availableThreadIds.lastOrNull && availableThreadIds.contains(currentThreadId)
|
||||
: currentEmailId != currentDisplayedEmails.lastOrNull?.id && currentDisplayedEmails.map((email) => email.id).contains(currentEmailId);
|
||||
|
||||
void onNext() {
|
||||
if (!nextAvailable) return;
|
||||
@@ -23,8 +23,8 @@ extension ThreadDetailNextPreviousActions on ThreadDetailManager {
|
||||
}
|
||||
|
||||
bool get previousAvailable => isThreadDetailEnabled
|
||||
? currentThreadId != availableThreadIds.firstOrNull
|
||||
: currentEmailId != currentDisplayedEmails.firstOrNull?.id;
|
||||
? currentThreadId != availableThreadIds.firstOrNull && availableThreadIds.contains(currentThreadId)
|
||||
: currentEmailId != currentDisplayedEmails.firstOrNull?.id && currentDisplayedEmails.map((email) => email.id).contains(currentEmailId);
|
||||
|
||||
void onPrevious() {
|
||||
if (!previousAvailable) return;
|
||||
@@ -32,7 +32,9 @@ extension ThreadDetailNextPreviousActions on ThreadDetailManager {
|
||||
final currentIndex = isThreadDetailEnabled
|
||||
? availableThreadIds.indexOf(currentThreadId!)
|
||||
: currentDisplayedEmails
|
||||
.indexOf(mailboxDashBoardController.selectedEmail.value!);
|
||||
.map((email) => email.id)
|
||||
.toList()
|
||||
.indexOf(mailboxDashBoardController.selectedEmail.value?.id);
|
||||
_navigate(currentIndex - 1, isThreadDetailEnabled);
|
||||
}
|
||||
|
||||
|
||||
+11
-12
@@ -5,7 +5,6 @@ import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/email/mark_star_action.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/email/read_actions.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/extensions/presentation_email_extension.dart';
|
||||
import 'package:model/extensions/session_extension.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||
@@ -308,9 +307,9 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
content: emailLoaded?.htmlContent,
|
||||
inlineImages: emailLoaded?.inlineImages,
|
||||
mailboxRole: presentationEmail.mailboxContain?.role,
|
||||
messageId: emailLoaded?.emailCurrent?.messageId,
|
||||
references: emailLoaded?.emailCurrent?.references,
|
||||
listPost: emailLoaded?.emailCurrent?.listPost,
|
||||
messageId: presentationEmail.messageId,
|
||||
references: presentationEmail.references,
|
||||
listPost: presentationEmail.listPost,
|
||||
)
|
||||
);
|
||||
},
|
||||
@@ -328,9 +327,9 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
content: emailLoaded?.htmlContent,
|
||||
inlineImages: emailLoaded?.inlineImages,
|
||||
mailboxRole: presentationEmail.mailboxContain?.role,
|
||||
messageId: emailLoaded?.emailCurrent?.messageId,
|
||||
references: emailLoaded?.emailCurrent?.references,
|
||||
listPost: emailLoaded?.emailCurrent?.listPost,
|
||||
messageId: presentationEmail.messageId,
|
||||
references: presentationEmail.references,
|
||||
listPost: presentationEmail.listPost,
|
||||
)
|
||||
);
|
||||
},
|
||||
@@ -347,9 +346,9 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
content: emailLoaded?.htmlContent,
|
||||
inlineImages: emailLoaded?.inlineImages,
|
||||
mailboxRole: presentationEmail.mailboxContain?.role,
|
||||
messageId: emailLoaded?.emailCurrent?.messageId,
|
||||
references: emailLoaded?.emailCurrent?.references,
|
||||
listPost: emailLoaded?.emailCurrent?.listPost,
|
||||
messageId: presentationEmail.messageId,
|
||||
references: presentationEmail.references,
|
||||
listPost: presentationEmail.listPost,
|
||||
)
|
||||
);
|
||||
},
|
||||
@@ -366,8 +365,8 @@ extension ThreadDetailOnEmailActionClick on ThreadDetailController {
|
||||
content: emailLoaded?.htmlContent,
|
||||
attachments: emailLoaded?.attachments,
|
||||
inlineImages: emailLoaded?.inlineImages,
|
||||
messageId: emailLoaded?.emailCurrent?.messageId,
|
||||
references: emailLoaded?.emailCurrent?.references,
|
||||
messageId: presentationEmail.messageId,
|
||||
references: presentationEmail.references,
|
||||
)
|
||||
);
|
||||
},
|
||||
|
||||
@@ -84,12 +84,14 @@ class ThreadDetailController extends BaseController {
|
||||
final additionalProperties = Properties({
|
||||
IndividualHeaderIdentifier.listPostHeader.value,
|
||||
IndividualHeaderIdentifier.listUnsubscribeHeader.value,
|
||||
EmailProperty.references,
|
||||
EmailProperty.messageId,
|
||||
});
|
||||
final cachedEmailLoaded = <EmailId, EmailLoaded>{};
|
||||
late final _threadGetDebouncer = Debouncer<ThreadId?>(
|
||||
const Duration(milliseconds: 500),
|
||||
initialValue: null,
|
||||
checkEquality: true,
|
||||
checkEquality: false,
|
||||
onChanged: (threadId) {
|
||||
if (_validateLoadThread(threadId)) {
|
||||
consumeState(_getEmailIdsByThreadIdInteractor.execute(
|
||||
|
||||
@@ -69,15 +69,6 @@ class ThreadDetailManager extends BaseController {
|
||||
ThreadDetailUIAction(),
|
||||
);
|
||||
});
|
||||
ever(
|
||||
currentDisplayedEmails,
|
||||
(emails) {
|
||||
if (mailboxDashBoardController.dashboardRoute.value != DashboardRoutes.threadDetailed) {
|
||||
return;
|
||||
}
|
||||
initializeThreadDetailManager(emails);
|
||||
},
|
||||
);
|
||||
ever(
|
||||
mailboxDashBoardController.dashboardRoute,
|
||||
(route) {
|
||||
|
||||
@@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart
|
||||
import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_app_bar_widget.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_back_button.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_utils.dart';
|
||||
|
||||
class ThreadDetailAppBar extends StatelessWidget {
|
||||
const ThreadDetailAppBar({
|
||||
@@ -140,7 +141,10 @@ class ThreadDetailAppBar extends StatelessWidget {
|
||||
],
|
||||
if (!responsiveUtils.isMobile(context)) const Spacer(),
|
||||
] else const Spacer(),
|
||||
...optionWidgets,
|
||||
if (AppUtils.getCurrentDirection(context) == TextDirection.rtl)
|
||||
...optionWidgets.reversed
|
||||
else
|
||||
...optionWidgets,
|
||||
if (lastEmailOfThread != null)
|
||||
TMailButtonWidget.fromIcon(
|
||||
icon: imagePaths.icMoreVertical,
|
||||
|
||||
Reference in New Issue
Block a user