Add presentation layer for get list Email in Mailbox
This commit is contained in:
@@ -3,47 +3,58 @@ import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.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/email/email_comparator.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_filter_condition.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
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/usecases/get_emails_in_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart';
|
||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
|
||||
class ThreadController extends BaseController {
|
||||
|
||||
final ResponsiveUtils responsiveUtils;
|
||||
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||
final GetEmailsInMailboxInteractor _getEmailsInMailboxInteractor;
|
||||
final ResponsiveUtils responsiveUtils;
|
||||
|
||||
final presentationMailCurrent = PresentationThread.createThreadEmpty().obs;
|
||||
final _properties = Properties({
|
||||
'id', 'subject', 'from', 'to', 'cc', 'bcc', 'keywords', 'receivedAt',
|
||||
'sentAt', 'preview', 'hasAttachment'
|
||||
});
|
||||
|
||||
ThreadController(this.responsiveUtils);
|
||||
final emailList = <PresentationEmail>[].obs;
|
||||
final loadMoreState = LoadMoreState.IDLE.obs;
|
||||
|
||||
int positionCurrent = 0;
|
||||
int lastGetTotal = 0;
|
||||
|
||||
ThreadController(
|
||||
this.responsiveUtils,
|
||||
this._getEmailsInMailboxInteractor
|
||||
);
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
mailboxDashBoardController.scaffoldKey.currentState?.openEndDrawer();
|
||||
mailboxDashBoardController.selectedMailbox.listen((selectedMailbox) {
|
||||
mailboxDashBoardController.setSelectedEmail(PresentationEmail.presentationEmailEmpty);
|
||||
refreshGetAllEmailAction();
|
||||
});
|
||||
}
|
||||
|
||||
SelectMode getSelectMode(PresentationThread presentationThread) {
|
||||
return presentationMailCurrent.value.id == presentationThread.id
|
||||
? SelectMode.ACTIVE
|
||||
: SelectMode.INACTIVE;
|
||||
}
|
||||
|
||||
void selectMail(BuildContext context, PresentationThread presentationMailSelected) {
|
||||
presentationMailCurrent.value = presentationMailSelected;
|
||||
mailboxDashBoardController.mailCurrent.value = presentationMailSelected;
|
||||
|
||||
if (!responsiveUtils.isDesktop(context)) {
|
||||
goToMail(context);
|
||||
}
|
||||
}
|
||||
|
||||
void goToMailbox({required GlobalKey<ScaffoldState> keyWidgetMailboxContainer}) {
|
||||
keyWidgetMailboxContainer.currentState?.openDrawer();
|
||||
}
|
||||
|
||||
void goToMail(BuildContext context) {
|
||||
Get.toNamed(AppRoutes.EMAIL);
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
mailboxDashBoardController.selectedMailbox.close();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -52,8 +63,123 @@ class ThreadController extends BaseController {
|
||||
}
|
||||
|
||||
@override
|
||||
void onDone() {}
|
||||
void onDone() {
|
||||
viewState.value.fold(
|
||||
(failure) => _resetPositionCurrentAndLoadMoreState(),
|
||||
(success) => _updateEmailList(success is GetAllEmailSuccess ? success.emailList : [])
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void onError(error) {}
|
||||
void onError(error) {
|
||||
_resetPositionCurrentAndLoadMoreState();
|
||||
}
|
||||
|
||||
void _updateEmailList(List<PresentationEmail> newListEmail) {
|
||||
emailList.value += newListEmail;
|
||||
|
||||
lastGetTotal = emailList.length;
|
||||
|
||||
if (newListEmail.isEmpty) {
|
||||
_resetPositionCurrentAndLoadMoreState();
|
||||
} else {
|
||||
loadMoreState.value = LoadMoreState.IDLE;
|
||||
}
|
||||
}
|
||||
|
||||
EmailFilterCondition? _getFilterConditionCurrent() {
|
||||
return mailboxDashBoardController.selectedMailbox.value.id != PresentationMailbox.presentationMailboxEmpty.id
|
||||
? EmailFilterCondition(inMailbox: mailboxDashBoardController.selectedMailbox.value.id)
|
||||
: null;
|
||||
}
|
||||
|
||||
Set<Comparator>? _getSortCurrent() {
|
||||
return Set()
|
||||
..add(EmailComparator(EmailComparatorProperty.sentAt)
|
||||
..setIsAscending(false));
|
||||
}
|
||||
|
||||
void _resetPositionCurrentAndLoadMoreState() {
|
||||
if (loadMoreState.value == LoadMoreState.LOADING) {
|
||||
positionCurrent -= lastGetTotal;
|
||||
}
|
||||
loadMoreState.value = LoadMoreState.COMPLETED;
|
||||
}
|
||||
|
||||
void getAllEmailAction(AccountId accountId,
|
||||
{
|
||||
UnsignedInt? limit,
|
||||
int position = 0,
|
||||
Set<Comparator>? sort,
|
||||
Filter? filter,
|
||||
Properties? properties,
|
||||
}
|
||||
) async {
|
||||
consumeState(_getEmailsInMailboxInteractor.execute(
|
||||
accountId,
|
||||
limit: limit,
|
||||
position: position,
|
||||
sort: sort,
|
||||
filter: filter,
|
||||
properties: properties
|
||||
));
|
||||
}
|
||||
|
||||
void refreshGetAllEmailAction() {
|
||||
loadMoreState.value = LoadMoreState.IDLE;
|
||||
positionCurrent = 0;
|
||||
emailList.clear();
|
||||
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
if (accountId != null) {
|
||||
getAllEmailAction(
|
||||
accountId,
|
||||
limit: ThreadConstants.defaultLimit,
|
||||
position: positionCurrent,
|
||||
sort: _getSortCurrent(),
|
||||
properties: _properties,
|
||||
filter: _getFilterConditionCurrent());
|
||||
}
|
||||
}
|
||||
|
||||
void loadMoreEmailAction() {
|
||||
loadMoreState.value = LoadMoreState.LOADING;
|
||||
positionCurrent += lastGetTotal;
|
||||
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
if (accountId != null) {
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
getAllEmailAction(
|
||||
accountId,
|
||||
limit: ThreadConstants.defaultLimit,
|
||||
position: positionCurrent,
|
||||
sort: _getSortCurrent(),
|
||||
properties: _properties,
|
||||
filter: _getFilterConditionCurrent());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
SelectMode getSelectMode(PresentationEmail presentationEmail, PresentationEmail selectedEmail) {
|
||||
return presentationEmail.id == selectedEmail.id
|
||||
? SelectMode.ACTIVE
|
||||
: SelectMode.INACTIVE;
|
||||
}
|
||||
|
||||
void selectEmail(BuildContext context, PresentationEmail presentationEmailSelected) {
|
||||
mailboxDashBoardController.setSelectedEmail(presentationEmailSelected);
|
||||
if (!responsiveUtils.isDesktop(context)) {
|
||||
goToEmail(context);
|
||||
}
|
||||
}
|
||||
|
||||
void goToMailbox() {
|
||||
mailboxDashBoardController.openDrawer();
|
||||
}
|
||||
|
||||
void goToEmail(BuildContext context) {
|
||||
Get.toNamed(AppRoutes.EMAIL);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user