TF-145 Implement LoadMoreEmails in ThreadView

This commit is contained in:
dab246
2021-10-07 17:41:31 +07:00
committed by Dat H. Pham
parent 1224173fa0
commit ee58a77758
29 changed files with 337 additions and 173 deletions
@@ -10,10 +10,9 @@ import 'package:tmail_ui_user/features/thread/data/model/email_change_response.d
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
abstract class ThreadDataSource {
Future<EmailResponse> getAllEmail(
Future<EmailsResponse> getAllEmail(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
@@ -18,10 +18,9 @@ class LocalThreadDataSourceImpl extends ThreadDataSource {
LocalThreadDataSourceImpl(this._emailCacheManager);
@override
Future<EmailResponse> getAllEmail(
Future<EmailsResponse> getAllEmail(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
@@ -18,23 +18,18 @@ class ThreadDataSourceImpl extends ThreadDataSource {
ThreadDataSourceImpl(this.threadAPI);
@override
Future<EmailResponse> getAllEmail(
Future<EmailsResponse> getAllEmail(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId
}
) {
return Future.sync(() async {
return await threadAPI.getAllEmail(
accountId,
position: position,
limit: limit,
sort: sort,
filter: filter,
@@ -65,7 +60,7 @@ class ThreadDataSourceImpl extends ThreadDataSource {
}
@override
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort}) {
Future<List<Email>> getAllEmailCache({MailboxId? inMailboxId, Set<Comparator>? sort, UnsignedInt? limit}) {
throw UnimplementedError();
}
@@ -25,9 +25,9 @@ class EmailChangeResponse with EquatableMixin {
});
EmailChangeResponse union(EmailChangeResponse other) => EmailChangeResponse(
updated: updated.union(other.updated),
created: created.union(other.created),
destroyed: destroyed.union(other.destroyed),
updated: updated.unite(other.updated),
created: created.unite(other.created),
destroyed: destroyed.unite(other.destroyed),
newStateEmail: other.newStateEmail,
newStateChanges: other.newStateChanges,
hasMoreChanges: other.hasMoreChanges,
@@ -24,10 +24,9 @@ class ThreadAPI {
ThreadAPI(this.httpClient);
Future<EmailResponse> getAllEmail(
Future<EmailsResponse> getAllEmail(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
@@ -40,8 +39,6 @@ class ThreadAPI {
final queryEmailMethod = QueryEmailMethod(accountId);
if (position != null) queryEmailMethod..addPosition(position);
if (limit != null) queryEmailMethod..addLimit(limit);
if (sort != null) queryEmailMethod..addSorts(sort);
@@ -74,7 +71,7 @@ class ThreadAPI {
});
}
return EmailResponse(emailList: resultList?.list, state: resultList?.state);
return EmailsResponse(emailList: resultList?.list, state: resultList?.state);
}
Future<EmailChangeResponse> getChanges(
@@ -25,34 +25,31 @@ class ThreadRepositoryImpl extends ThreadRepository {
ThreadRepositoryImpl(this.mapDataSource, this.stateDataSource);
@override
Stream<EmailResponse> getAllEmail(
Stream<EmailsResponse> getAllEmail(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
EmailFilter? emailFilter,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId
}
) async* {
final localEmailResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort),
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort),
stateDataSource.getState(StateType.email)
]).then((List response) {
return EmailResponse(emailList: response.first, state: response.last);
return EmailsResponse(emailList: response.first, state: response.last);
});
EmailResponse? networkEmailResponse;
EmailsResponse? networkEmailResponse;
if (!localEmailResponse.hasEmails()) {
networkEmailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
accountId,
position: position,
limit: limit,
sort: sort,
filter: filter,
filter: emailFilter?.filter,
properties: propertiesCreated);
yield networkEmailResponse;
@@ -113,10 +110,10 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
final newEmailResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort),
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: emailFilter?.mailboxId, sort: sort),
stateDataSource.getState(StateType.email)
]).then((List response) {
return EmailResponse(emailList: response.first, state: response.last);
return EmailsResponse(emailList: response.first, state: response.last);
});
yield newEmailResponse;
@@ -132,7 +129,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
if (updatedProperties == null) {
return email;
} else {
final emailOld = emailCacheList?.findEmail(email.id);
final emailOld = emailCacheList?.findEmailById(email.id);
if (emailOld != null) {
return emailOld.combineEmail(email, updatedProperties);
} else {
@@ -162,10 +159,11 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
@override
Stream<EmailResponse> refreshChanges(
Stream<EmailsResponse> refreshChanges(
AccountId accountId,
State currentState,
{
UnsignedInt? limit,
Set<Comparator>? sort,
Properties? propertiesCreated,
Properties? propertiesUpdated,
@@ -173,8 +171,8 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
) async* {
final localEmailList = await mapDataSource[DataSourceType.local]!.getAllEmailCache(
inMailboxId: inMailboxId,
sort: sort);
inMailboxId: inMailboxId,
sort: sort);
EmailChangeResponse? emailChangeResponse;
bool hasMoreChanges = true;
@@ -217,9 +215,38 @@ class ThreadRepositoryImpl extends ThreadRepository {
mapDataSource[DataSourceType.local]!.getAllEmailCache(inMailboxId: inMailboxId, sort: sort),
stateDataSource.getState(StateType.email)
]).then((List response) {
return EmailResponse(emailList: response.first, state: response.last);
return EmailsResponse(emailList: response.first, state: response.last);
});
yield newEmailResponse;
}
@override
Stream<EmailsResponse> loadMoreEmails(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
}
) async* {
final emailResponse = await mapDataSource[DataSourceType.network]!.getAllEmail(
accountId,
limit: limit,
sort: sort,
filter: filter,
properties: properties);
final newEmailList = emailResponse.emailList != null && emailResponse.emailList!.isNotEmpty
? emailResponse.emailList!.sublist(1)
: <Email>[];
if (newEmailList.isNotEmpty) {
await _updateEmailCache(newCreated: newEmailList);
}
yield EmailsResponse(emailList: newEmailList, state: emailResponse.state);
}
}
@@ -3,11 +3,11 @@ import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
class EmailResponse with EquatableMixin {
class EmailsResponse with EquatableMixin {
final List<Email>? emailList;
final State? state;
EmailResponse({
EmailsResponse({
this.emailList,
this.state
});
@@ -5,23 +5,22 @@ import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
abstract class ThreadRepository {
Stream<EmailResponse> getAllEmail(
Stream<EmailsResponse> getAllEmail(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
EmailFilter? emailFilter,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId
}
);
Stream<EmailResponse> refreshChanges(
Stream<EmailsResponse> refreshChanges(
AccountId accountId,
jmap.State currentState,
{
@@ -31,4 +30,14 @@ abstract class ThreadRepository {
MailboxId? inMailboxId
}
);
Stream<EmailsResponse> loadMoreEmails(
AccountId accountId,
{
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties,
}
);
}
@@ -0,0 +1,20 @@
import 'package:core/core.dart';
import 'package:model/model.dart';
class LoadMoreEmailsSuccess extends UIState {
final List<PresentationEmail> emailList;
LoadMoreEmailsSuccess(this.emailList);
@override
List<Object?> get props => [emailList];
}
class LoadMoreEmailsFailure extends FeatureFailure {
final exception;
LoadMoreEmailsFailure(this.exception);
@override
List<Object> get props => [exception];
}
@@ -1,11 +1,9 @@
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
@@ -19,13 +17,11 @@ class GetEmailsInMailboxInteractor {
Stream<Either<Failure, Success>> execute(
AccountId accountId,
{
int? position,
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
EmailFilter? emailFilter,
Properties? propertiesCreated,
Properties? propertiesUpdated,
MailboxId? inMailboxId
}
) async* {
try {
@@ -34,20 +30,18 @@ class GetEmailsInMailboxInteractor {
yield* threadRepository
.getAllEmail(
accountId,
position: position,
limit: limit,
sort: sort,
filter: filter,
emailFilter: emailFilter,
propertiesCreated: propertiesCreated,
propertiesUpdated: propertiesUpdated,
inMailboxId: inMailboxId)
propertiesUpdated: propertiesUpdated)
.map(_toGetEmailState);
} catch (e) {
yield Left(GetAllEmailFailure(e));
}
}
Either<Failure, Success> _toGetEmailState(EmailResponse emailResponse) {
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
final presentationEmailList = emailResponse.emailList
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
@@ -0,0 +1,49 @@
import 'package:core/core.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
class LoadMoreEmailsInMailboxInteractor {
final ThreadRepository threadRepository;
LoadMoreEmailsInMailboxInteractor(this.threadRepository);
Stream<Either<Failure, Success>> execute(
AccountId accountId,
{
UnsignedInt? limit,
Set<Comparator>? sort,
Filter? filter,
Properties? properties
}
) async* {
try {
yield Right<Failure, Success>(LoadingMoreState());
yield* threadRepository
.loadMoreEmails(
accountId,
limit: limit,
sort: sort,
filter: filter,
properties: properties)
.map(_toGetEmailState);
} catch (e) {
yield Left(LoadMoreEmailsFailure(e));
}
}
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
final presentationEmailList = emailResponse.emailList
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
return Right<Failure, Success>(LoadMoreEmailsSuccess(presentationEmailList));
}
}
@@ -25,6 +25,8 @@ class RefreshChangesEmailsInMailboxInteractor {
MailboxId? inMailboxId
}
) async* {
yield Right<Failure, Success>(RefreshingState());
try {
yield* threadRepository
.refreshChanges(
@@ -40,7 +42,7 @@ class RefreshChangesEmailsInMailboxInteractor {
}
}
Either<Failure, Success> _toGetEmailState(EmailResponse emailResponse) {
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
final presentationEmailList = emailResponse.emailList
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
@@ -1,6 +0,0 @@
enum LoadMoreState {
IDLE,
LOADING,
COMPLETED
}
@@ -21,6 +21,7 @@ import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
import 'package:tmail_ui_user/features/thread/data/repository/thread_repository_impl.dart';
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
@@ -56,6 +57,7 @@ class ThreadBindings extends Bindings {
Get.lazyPut(() => MarkAsStarEmailInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => MarkAsStarMultipleEmailInteractor(Get.find<EmailRepository>()));
Get.lazyPut(() => RefreshChangesEmailsInMailboxInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => LoadMoreEmailsInMailboxInteractor(Get.find<ThreadRepository>()));
Get.put(ThreadController(
Get.find<ResponsiveUtils>(),
Get.find<GetEmailsInMailboxInteractor>(),
@@ -66,6 +68,7 @@ class ThreadBindings extends Bindings {
Get.find<MarkAsStarEmailInteractor>(),
Get.find<MarkAsStarMultipleEmailInteractor>(),
Get.find<RefreshChangesEmailsInMailboxInteractor>(),
Get.find<LoadMoreEmailsInMailboxInteractor>(),
));
}
}
@@ -22,15 +22,16 @@ import 'package:tmail_ui_user/features/email/presentation/model/composer_argumen
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
@@ -48,13 +49,12 @@ class ThreadController extends BaseController {
final MarkAsStarEmailInteractor _markAsStarEmailInteractor;
final MarkAsStarMultipleEmailInteractor _markAsStarMultipleEmailInteractor;
final RefreshChangesEmailsInMailboxInteractor _refreshChangesEmailsInMailboxInteractor;
final LoadMoreEmailsInMailboxInteractor _loadMoreEmailsInMailboxInteractor;
final emailList = <PresentationEmail>[].obs;
final loadMoreState = LoadMoreState.IDLE.obs;
final currentSelectMode = SelectMode.INACTIVE.obs;
int _currentPosition = 0;
int _totalNumberOfEmails = 0;
bool canLoadMore = true;
MailboxId? _currentMailboxId;
jmap.State? _currentEmailState;
@@ -77,6 +77,7 @@ class ThreadController extends BaseController {
this._markAsStarEmailInteractor,
this._markAsStarMultipleEmailInteractor,
this._refreshChangesEmailsInMailboxInteractor,
this._loadMoreEmailsInMailboxInteractor,
);
@override
@@ -122,20 +123,27 @@ class ThreadController extends BaseController {
@override
void onData(Either<Failure, Success> newState) {
super.onData(newState);
newState.map((success) {
if (success is GetAllEmailSuccess) {
_getAllEmailSuccess(success);
newState.fold(
(failure) {
if (failure is LoadMoreEmailsFailure) {
canLoadMore = false;
}
},
(success) {
if (success is GetAllEmailSuccess) {
_getAllEmailSuccess(success);
} else if (success is LoadMoreEmailsSuccess) {
_loadMoreEmailsSuccess(success);
}
}
});
);
}
@override
void onDone() {
viewState.value.fold(
(failure) {
if (failure is GetAllEmailFailure) {
_resetPositionCurrentAndLoadMoreState();
} else if (failure is MarkAsMultipleEmailReadAllFailure
if (failure is MarkAsMultipleEmailReadAllFailure
|| failure is MarkAsMultipleEmailReadFailure) {
_markAsSelectedEmailReadFailure(failure);
} else if (failure is MarkAsStarMultipleEmailAllFailure
@@ -165,49 +173,36 @@ class ThreadController extends BaseController {
void _getAllEmail() {
if (_accountId != null) {
_getAllEmailAction(_accountId!, inMailboxId: _currentMailboxId);
_getAllEmailAction(_accountId!, mailboxId: _currentMailboxId);
}
}
void _resetToOriginalValue() {
dispatchState(Right(LoadingState()));
emailList.value = <PresentationEmail>[];
loadMoreState.value = LoadMoreState.IDLE;
_currentPosition = 0;
canLoadMore = true;
}
void _getAllEmailSuccess(Success success) {
if (success is GetAllEmailSuccess) {
_currentEmailState = success.currentEmailState;
if (loadMoreState.value == LoadMoreState.LOADING) {
emailList.addAll(success.emailList);
} else {
emailList.value = success.emailList;
}
_totalNumberOfEmails = emailList.length;
loadMoreState.value = success.emailList.isEmpty ? LoadMoreState.COMPLETED : LoadMoreState.IDLE;
}
void _getAllEmailSuccess(GetAllEmailSuccess success) {
_currentEmailState = success.currentEmailState;
emailList.value = success.emailList;
}
void _getAllEmailAction(AccountId accountId, {MailboxId? inMailboxId}) {
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
consumeState(_getEmailsInMailboxInteractor.execute(
accountId,
limit: ThreadConstants.defaultLimit,
position: _currentPosition,
sort: _sortOrder,
filter: _filterCondition,
emailFilter: EmailFilter(
filter: _filterCondition,
mailboxId: mailboxId ?? _currentMailboxId),
propertiesCreated: ThreadConstants.propertiesDefault,
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault,
inMailboxId: inMailboxId ?? _currentMailboxId
));
}
void refreshAllEmail() {
dispatchState(Right(LoadingState()));
loadMoreState.value = LoadMoreState.IDLE;
_currentPosition = 0;
_getAllEmail();
}
@@ -224,20 +219,28 @@ class ThreadController extends BaseController {
}
}
void loadMoreEmailAction() {
loadMoreState.value = LoadMoreState.LOADING;
_currentPosition += _totalNumberOfEmails;
if (_accountId != null) {
_getAllEmailAction(_accountId!);
void loadMoreEmails() {
if (canLoadMore) {
if (_accountId != null) {
consumeState(_loadMoreEmailsInMailboxInteractor.execute(
_accountId!,
limit: ThreadConstants.defaultLimit,
sort: _sortOrder,
filter: EmailFilterCondition(
inMailbox: mailboxDashBoardController.selectedMailbox.value?.id,
before: emailList.last.receivedAt),
properties: ThreadConstants.propertiesDefault,
));
}
}
}
void _resetPositionCurrentAndLoadMoreState() {
if (loadMoreState.value == LoadMoreState.LOADING) {
_currentPosition -= _totalNumberOfEmails;
void _loadMoreEmailsSuccess(LoadMoreEmailsSuccess success) {
if (success.emailList.isNotEmpty) {
emailList.addAll(success.emailList);
} else {
canLoadMore = false;
}
loadMoreState.value = LoadMoreState.IDLE;
}
SelectMode getSelectMode(PresentationEmail presentationEmail, PresentationEmail? selectedEmail) {
@@ -421,7 +424,6 @@ class ThreadController extends BaseController {
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
if (_accountId != null && mailboxCurrent != null) {
final importantAction = presentationEmail.isFlaggedEmail() ? MarkStarAction.unMarkStar : MarkStarAction.markStar;
dispatchState(Right(LoadingState()));
consumeState(_markAsStarEmailInteractor.execute(_accountId!, presentationEmail.toEmail(), importantAction));
}
}
@@ -5,7 +5,6 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart';
@@ -184,7 +183,7 @@ class ThreadView extends GetWidget<ThreadController> {
Widget _buildLoadingView() {
return Obx(() => controller.viewState.value.fold(
(failure) => SizedBox.shrink(),
(success) => success is LoadingState && controller.loadMoreState.value != LoadMoreState.LOADING
(success) => success is LoadingState
? Center(child: Padding(
padding: EdgeInsets.only(top: 16, bottom: 16),
child: SizedBox(
@@ -195,14 +194,16 @@ class ThreadView extends GetWidget<ThreadController> {
}
Widget _buildLoadingViewLoadMore() {
return Obx(() => controller.loadMoreState.value == LoadMoreState.LOADING
? Center(child: Padding(
padding: EdgeInsets.only(top: 16, bottom: 16),
child: SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(color: AppColor.primaryColor))))
: SizedBox.shrink());
return Obx(() => controller.viewState.value.fold(
(failure) => SizedBox.shrink(),
(success) => success is LoadingMoreState
? Center(child: Padding(
padding: EdgeInsets.only(top: 16, bottom: 16),
child: SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(color: AppColor.primaryColor))))
: SizedBox.shrink()));
}
Widget _buildListEmail(BuildContext context) {
@@ -232,9 +233,8 @@ class ThreadView extends GetWidget<ThreadController> {
return NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification scrollInfo) {
if (scrollInfo is ScrollEndNotification
&& controller.loadMoreState.value == LoadMoreState.IDLE
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
controller.loadMoreEmailAction();
controller.loadMoreEmails();
}
return false;
},