Skip to content

Commit 005d6ed

Browse files
committed
TF-4400 Add collapseThreads for load more & refresh change when force email query = true
1 parent 33895fd commit 005d6ed

File tree

8 files changed

+60
-12
lines changed

8 files changed

+60
-12
lines changed

lib/features/mailbox_dashboard/presentation/mixin/setup_preferences_setting_mixin.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ mixin SetupPreferencesSettingMixin on EmitStateMixin {
2727
bool get forceEmailQuery =>
2828
PlatformInfo.isWeb && AppConfig.isForceEmailQueryEnabled;
2929

30+
bool get collapseThreads => isThreadDetailEnabled == true && forceEmailQuery;
31+
3032
void _setPreferencesSetting(PreferencesSetting setting) =>
3133
_preferencesSetting = setting;
3234

@@ -49,14 +51,14 @@ mixin SetupPreferencesSettingMixin on EmitStateMixin {
4951
final currentPreferencesSetting = _preferencesSetting;
5052
final newPreferencesSetting = success.preferencesSetting;
5153

54+
_setPreferencesSetting(newPreferencesSetting);
55+
5256
if (currentPreferencesSetting != null) {
5357
_verifyThreadSettingStateChanged(
5458
currentSetting: currentPreferencesSetting,
5559
newSetting: newPreferencesSetting,
5660
);
5761
}
58-
59-
_setPreferencesSetting(newPreferencesSetting);
6062
}
6163

6264
void scribeLoadPreferencesSettingFailure(GetLocalSettingsFailure failure) {

lib/features/thread/data/repository/thread_repository_impl.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
247247
MailboxId? mailboxId,
248248
Properties? propertiesCreated,
249249
Filter? filter,
250+
bool? collapseThreads,
250251
}
251252
) async {
252253
final networkEmailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
@@ -257,6 +258,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
257258
sort: sort,
258259
filter: filter ?? EmailFilterCondition(inMailbox: mailboxId),
259260
properties: propertiesCreated,
261+
collapseThreads: collapseThreads,
260262
);
261263
await _updateEmailCache(
262264
accountId,
@@ -367,6 +369,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
367369
EmailFilter? emailFilter,
368370
Properties? propertiesCreated,
369371
Properties? propertiesUpdated,
372+
bool? collapseThreads,
370373
}
371374
) async* {
372375
log('ThreadRepositoryImpl::refreshChanges(): $currentState');
@@ -402,9 +405,11 @@ class ThreadRepositoryImpl extends ThreadRepository {
402405
filter: emailFilter?.filter,
403406
mailboxId: emailFilter?.mailboxId,
404407
propertiesCreated: propertiesCreated,
408+
collapseThreads: collapseThreads,
405409
);
406410
logTrace(
407411
'ThreadRepositoryImpl::refreshChanges():'
412+
'collapseThreads = $collapseThreads, '
408413
'CountEmailCached = ${newEmailResponse.emailList?.length}, '
409414
'EmailStateCache = ${newEmailResponse.state?.value}, '
410415
'InMailboxId = ${emailFilter?.mailboxId?.asString}, '
@@ -417,6 +422,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
417422
} else {
418423
logTrace(
419424
'ThreadRepositoryImpl::refreshChanges():'
425+
'collapseThreads = $collapseThreads, '
420426
'CountEmailCached = ${newEmailResponse.emailList?.length}, '
421427
'EmailStateCache = ${newEmailResponse.state?.value}, '
422428
'InMailboxId = ${emailFilter?.mailboxId?.asString}, '
@@ -456,9 +462,13 @@ class ThreadRepositoryImpl extends ThreadRepository {
456462
position: emailRequest.position,
457463
sort: emailRequest.sort,
458464
filter: emailRequest.filter,
459-
properties: emailRequest.properties)
465+
properties: emailRequest.properties,
466+
collapseThreads: emailRequest.collapseThreads,
467+
)
460468
.then((response) {
461-
final listEmails = response.emailList;
469+
final listEmails = emailRequest.collapseThreads == true
470+
? response.threadEmails
471+
: response.emailList;
462472
if (emailRequest.lastEmailId != null && listEmails?.isNotEmpty == true) {
463473
listEmails?.removeWhere((email) => email.id == emailRequest.lastEmailId);
464474
}
@@ -627,6 +637,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
627637
Set<Comparator>? sort,
628638
EmailFilter? emailFilter,
629639
Properties? propertiesCreated,
640+
bool? collapseThreads,
630641
}) async* {
631642
final networkDataSource = mapDataSource[DataSourceType.network]!;
632643
final emailResponse = await networkDataSource.getAllEmail(
@@ -637,6 +648,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
637648
sort: sort,
638649
filter: emailFilter?.filter,
639650
properties: propertiesCreated,
651+
collapseThreads: collapseThreads,
640652
);
641653
yield emailResponse;
642654
}

lib/features/thread/domain/model/get_email_request.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class GetEmailRequest with EquatableMixin {
1919
final Properties? properties;
2020
final EmailId? lastEmailId;
2121
final bool useCache;
22+
final bool? collapseThreads;
2223

2324
GetEmailRequest(
2425
this.session,
@@ -32,6 +33,7 @@ class GetEmailRequest with EquatableMixin {
3233
this.properties,
3334
this.lastEmailId,
3435
this.useCache = true,
36+
this.collapseThreads,
3537
}
3638
);
3739

@@ -47,5 +49,6 @@ class GetEmailRequest with EquatableMixin {
4749
lastEmailId,
4850
filterOption,
4951
useCache,
52+
collapseThreads,
5053
];
5154
}

lib/features/thread/domain/repository/thread_repository.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ abstract class ThreadRepository {
4141
Set<Comparator>? sort,
4242
EmailFilter? emailFilter,
4343
Properties? propertiesCreated,
44+
bool? collapseThreads,
4445
});
4546

4647
Stream<EmailsResponse> forceQueryAllEmailsForWeb({
@@ -64,6 +65,7 @@ abstract class ThreadRepository {
6465
EmailFilter? emailFilter,
6566
Properties? propertiesCreated,
6667
Properties? propertiesUpdated,
68+
bool? collapseThreads,
6769
}
6870
);
6971

lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class GetEmailsInMailboxInteractor {
6868
sort: sort,
6969
emailFilter: emailFilter,
7070
propertiesCreated: propertiesCreated,
71+
collapseThreads: collapseThreads,
7172
);
7273
}
7374

lib/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:dartz/dartz.dart';
44
import 'package:model/extensions/email_extension.dart';
55
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
66
import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart';
7+
import 'package:tmail_ui_user/features/thread/domain/model/thread_email.dart';
78
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
89
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
910

@@ -23,7 +24,15 @@ class LoadMoreEmailsInMailboxInteractor {
2324

2425
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
2526
final presentationEmailList = emailResponse.emailList
26-
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
27+
?.map((email) {
28+
if (email is ThreadEmail) {
29+
return email.toPresentationEmail(
30+
emailIdsInThread: email.emailIdsInThread,
31+
);
32+
} else {
33+
return email.toPresentationEmail();
34+
}
35+
}).toList() ?? List.empty();
2736

2837
return Right<Failure, Success>(LoadMoreEmailsSuccess(presentationEmailList));
2938
}

lib/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
88
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
99
import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart';
1010
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
11+
import 'package:tmail_ui_user/features/thread/domain/model/thread_email.dart';
1112
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
1213
import 'package:model/model.dart';
1314
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
@@ -28,6 +29,7 @@ class RefreshChangesEmailsInMailboxInteractor {
2829
Properties? propertiesCreated,
2930
Properties? propertiesUpdated,
3031
EmailFilter? emailFilter,
32+
bool? collapseThreads,
3133
}
3234
) async* {
3335
yield Right<Failure, Success>(RefreshChangesAllEmailLoading());
@@ -42,7 +44,9 @@ class RefreshChangesEmailsInMailboxInteractor {
4244
limit: limit,
4345
propertiesCreated: propertiesCreated,
4446
propertiesUpdated: propertiesUpdated,
45-
emailFilter: emailFilter)
47+
emailFilter: emailFilter,
48+
collapseThreads: collapseThreads,
49+
)
4650
.map((emailResponse) => _toGetEmailState(
4751
emailResponse: emailResponse,
4852
currentMailboxId: emailFilter?.mailboxId
@@ -57,7 +61,15 @@ class RefreshChangesEmailsInMailboxInteractor {
5761
MailboxId? currentMailboxId
5862
}) {
5963
final presentationEmailList = emailResponse.emailList
60-
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
64+
?.map((email) {
65+
if (email is ThreadEmail) {
66+
return email.toPresentationEmail(
67+
emailIdsInThread: email.emailIdsInThread,
68+
);
69+
} else {
70+
return email.toPresentationEmail();
71+
}
72+
}).toList() ?? List.empty();
6173

6274
return Right<Failure, Success>(RefreshChangesAllEmailSuccess(
6375
emailList: presentationEmailList,

lib/features/thread/presentation/thread_controller.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,6 @@ class ThreadController extends BaseController with EmailActionController {
359359
refreshAllEmail(shouldClearCache: PlatformInfo.isWeb);
360360
mailboxDashBoardController.clearEmailUIAction();
361361
} else if (action is RefreshEmailListViewOnForceEmailQueryAction) {
362-
consumeState(Stream.value(Right(GetAllEmailLoading())));
363-
resetToOriginalValue();
364362
getAllEmailAction(forceEmailQuery: forceEmailQuery);
365363
mailboxDashBoardController.clearEmailUIAction();
366364
}
@@ -671,7 +669,11 @@ class ThreadController extends BaseController with EmailActionController {
671669
bool getLatestChanges = true,
672670
bool forceEmailQuery = false,
673671
}) {
674-
log('ThreadController::_getAllEmailAction:getLatestChanges = $getLatestChanges');
672+
log(
673+
'ThreadController::_getAllEmailAction:'
674+
'getLatestChanges = $getLatestChanges, '
675+
'forceEmailQuery = $forceEmailQuery ',
676+
);
675677
if (_session != null &&_accountId != null) {
676678
consumeState(_getEmailsInMailboxInteractor.execute(
677679
_session!,
@@ -687,7 +689,7 @@ class ThreadController extends BaseController with EmailActionController {
687689
getLatestChanges: getLatestChanges,
688690
useCache: selectedMailbox?.isCacheable ?? false,
689691
forceEmailQuery: forceEmailQuery,
690-
collapseThreads: mailboxDashBoardController.isThreadDetailEnabled,
692+
collapseThreads: mailboxDashBoardController.collapseThreads,
691693
));
692694
} else {
693695
consumeState(Stream.value(Left(GetAllEmailFailure(NotFoundSessionException()))));
@@ -823,6 +825,7 @@ class ThreadController extends BaseController with EmailActionController {
823825
_accountId!,
824826
),
825827
emailFilter: getEmailFilterForLoadMailbox(),
828+
collapseThreads: mailboxDashBoardController.collapseThreads,
826829
).last;
827830

828831
refreshState.fold(
@@ -874,6 +877,7 @@ class ThreadController extends BaseController with EmailActionController {
874877
_accountId!,
875878
),
876879
useCache: false,
880+
collapseThreads: mailboxDashBoardController.collapseThreads,
877881
)
878882
.last;
879883

@@ -900,9 +904,11 @@ class ThreadController extends BaseController with EmailActionController {
900904
currentListEmail.isNotEmpty ? currentListEmail.last : null;
901905
final useCache = selectedMailbox?.isCacheable ?? false;
902906
final filterOption = mailboxDashBoardController.filterMessageOption.value;
907+
final collapseThreads = mailboxDashBoardController.collapseThreads;
903908

904909
logTrace(
905910
'ThreadController::_loadMoreEmails: '
911+
'collapseThreads = $collapseThreads, '
906912
'OldestEmailID = ${oldestEmail?.id?.asString}, '
907913
'useCache = $useCache, '
908914
'filterOption = ${filterOption.name}',
@@ -914,11 +920,12 @@ class ThreadController extends BaseController with EmailActionController {
914920
_accountId!,
915921
limit: ThreadConstants.defaultLimit,
916922
sort: EmailSortOrderType.mostRecent.getSortOrder().toNullable(),
917-
filterOption: mailboxDashBoardController.filterMessageOption.value,
923+
filterOption: filterOption,
918924
filter: getFilterConditionForLoadMailbox(oldestEmail: oldestEmail),
919925
properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!),
920926
lastEmailId: oldestEmail?.id,
921927
useCache: useCache,
928+
collapseThreads: collapseThreads,
922929
)
923930
));
924931
} else {

0 commit comments

Comments
 (0)