TF-2189 Keep composer available before click on proceed

(cherry picked from commit a818b91fc6faa395c9935cd411676b914c237b1f)
This commit is contained in:
dab246
2023-10-03 19:33:51 +07:00
committed by Dat H. Pham
parent f860695fea
commit cc9767cf16
5 changed files with 156 additions and 131 deletions
@@ -51,6 +51,7 @@ import 'package:tmail_ui_user/features/composer/presentation/controller/rich_tex
import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/file_upload_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/image_source.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart';
@@ -872,31 +873,101 @@ class ComposerController extends BaseController {
? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
: null;
final sendingEmailArguments = SendingEmailArguments(
session,
accountId,
emailRequest,
mailboxRequest,
sendingEmailActionType: arguments.sendingEmail != null
? SendingEmailActionType.edit
: SendingEmailActionType.create,
);
uploadController.clearInlineFileUploaded();
if (PlatformInfo.isWeb) {
closeComposerWeb(result: sendingEmailArguments);
if (PlatformInfo.isMobile && !networkConnectionController.isNetworkConnectionAvailable()) {
switch(arguments.sendingEmailActionType) {
case SendingEmailActionType.create:
_showConfirmDialogStoreSendingEmail(
SendingEmailArguments(
session,
accountId,
emailRequest,
mailboxRequest,
actionMode: ComposeActionMode.pushQueue
)
);
break;
case SendingEmailActionType.edit:
uploadController.clearInlineFileUploaded();
_closeComposerAction(
result: SendingEmailArguments(
session,
accountId,
emailRequest,
mailboxRequest,
actionMode: ComposeActionMode.editQueue
)
);
break;
default:
uploadController.clearInlineFileUploaded();
_closeComposerAction(
result: SendingEmailArguments(
session,
accountId,
emailRequest,
mailboxRequest,
)
);
}
} else {
popBack(result: sendingEmailArguments);
uploadController.clearInlineFileUploaded();
_closeComposerAction(
result: SendingEmailArguments(
session,
accountId,
emailRequest,
mailboxRequest,
)
);
}
} else {
if (PlatformInfo.isWeb) {
closeComposerWeb();
} else {
popBack();
}
logError('ComposerController::_handleSendMessages: arguments/accountId/userProfile/session is NULL');
uploadController.clearInlineFileUploaded();
_closeComposerAction();
}
}
void _showConfirmDialogStoreSendingEmail(SendingEmailArguments sendingEmailArguments) {
showConfirmDialogAction(
currentContext!,
'',
AppLocalizations.of(currentContext!).proceed,
onConfirmAction: () {
uploadController.clearInlineFileUploaded();
_closeComposerAction(result: sendingEmailArguments);
},
title: AppLocalizations.of(currentContext!).youAreInOfflineMode,
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode),
alignCenter: true,
messageStyle: const TextStyle(
color: AppColor.colorTitleSendingItem,
fontSize: 15,
fontWeight: FontWeight.normal
),
listTextSpan: [
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst),
TextSpan(
text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond,
style: const TextStyle(
color: AppColor.colorTitleSendingItem,
fontSize: 15,
fontWeight: FontWeight.w600
),
),
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird),
TextSpan(
text: AppLocalizations.of(currentContext!).sendingQueue,
style: const TextStyle(
color: AppColor.colorTitleSendingItem,
fontSize: 15,
fontWeight: FontWeight.w600
),
),
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail)
]
);
}
void _checkContactPermission() async {
final permissionStatus = await Permission.contacts.status;
if (permissionStatus.isGranted) {
@@ -1369,7 +1440,15 @@ class ComposerController extends BaseController {
FocusScope.of(context).unfocus();
}
void closeComposerWeb({dynamic result}) {
void _closeComposerAction({dynamic result}) {
if (PlatformInfo.isWeb) {
_closeComposerWeb(result: result);
} else {
popBack(result: result);
}
}
void _closeComposerWeb({dynamic result}) {
FocusManager.instance.primaryFocus?.unfocus();
mailboxDashBoardController.closeComposerOverlay(result: result);
}
@@ -0,0 +1,6 @@
enum ComposeActionMode {
pushQueue,
editQueue,
sent
}
@@ -5,6 +5,7 @@ import 'package:model/model.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/composer_cache.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
class ComposerArguments extends RouterArguments {
@@ -131,6 +132,10 @@ class ComposerArguments extends RouterArguments {
references: references,
);
SendingEmailActionType get sendingEmailActionType => sendingEmail != null
? SendingEmailActionType.edit
: SendingEmailActionType.create;
@override
List<Object?> get props => [
emailActionType,
@@ -29,6 +29,7 @@ import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_draft
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart';
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart';
@@ -104,7 +105,6 @@ import 'package:tmail_ui_user/features/sending_queue/domain/state/update_sending
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart';
import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
@@ -368,13 +368,21 @@ class MailboxDashBoardController extends ReloadableController {
if (PlatformInfo.isMobile &&
failure is SendEmailFailure &&
exception is NoNetworkError) {
_handleSendingEmailWhenNoNetwork(
failure.session,
failure.accountId,
failure.emailRequest,
failure.mailboxRequest,
failure.sendingEmailActionType
);
if (failure.emailRequest.storedSendingId != null) {
_handleStoreSendingEmail(
failure.session,
failure.accountId,
failure.emailRequest,
failure.mailboxRequest
);
} else {
_handleUpdateSendingEmail(
failure.session,
failure.accountId,
failure.emailRequest,
failure.mailboxRequest
);
}
}
}
@@ -1243,13 +1251,7 @@ class MailboxDashBoardController extends ReloadableController {
composerOverlayState.value = ComposerOverlayState.inActive;
if (result is SendingEmailArguments) {
handleSendEmailAction(
result.session,
result.accountId,
result.emailRequest,
result.mailboxRequest,
result.sendingEmailActionType
);
handleSendEmailAction(result);
}
}
@@ -1361,13 +1363,7 @@ class MailboxDashBoardController extends ReloadableController {
} else {
final result = await push(AppRoutes.composer, arguments: arguments);
if (result is SendingEmailArguments) {
handleSendEmailAction(
result.session,
result.accountId,
result.emailRequest,
result.mailboxRequest,
result.sendingEmailActionType
);
handleSendEmailAction(result);
}
}
}
@@ -1806,47 +1802,31 @@ class MailboxDashBoardController extends ReloadableController {
clearState();
}
void handleSendEmailAction(
Session session,
AccountId accountId,
EmailRequest emailRequest,
CreateNewMailboxRequest? mailboxRequest,
SendingEmailActionType sendingEmailActionType
) {
if (PlatformInfo.isWeb ||
(PlatformInfo.isMobile && networkConnectionController.isNetworkConnectionAvailable())) {
consumeState(_sendEmailInteractor.execute(
session,
accountId,
emailRequest,
mailboxRequest: mailboxRequest
));
} else {
_handleSendingEmailWhenNoNetwork(
session,
accountId,
emailRequest,
mailboxRequest,
sendingEmailActionType
);
}
}
void _handleSendingEmailWhenNoNetwork(
Session session,
AccountId accountId,
EmailRequest emailRequest,
CreateNewMailboxRequest? mailboxRequest,
SendingEmailActionType? sendingEmailActionType
) {
switch(sendingEmailActionType) {
case SendingEmailActionType.create:
_showConfirmDialogStoreSendingEmail(session, accountId, emailRequest, mailboxRequest);
void handleSendEmailAction(SendingEmailArguments arguments) {
switch(arguments.actionMode) {
case ComposeActionMode.pushQueue:
_handleStoreSendingEmail(
arguments.session,
arguments.accountId,
arguments.emailRequest,
arguments.mailboxRequest
);
break;
case SendingEmailActionType.edit:
_handleUpdateSendingEmail(session, accountId, emailRequest, mailboxRequest);
case ComposeActionMode.editQueue:
_handleUpdateSendingEmail(
arguments.session,
arguments.accountId,
arguments.emailRequest,
arguments.mailboxRequest
);
break;
default:
case ComposeActionMode.sent:
consumeState(_sendEmailInteractor.execute(
arguments.session,
arguments.accountId,
arguments.emailRequest,
mailboxRequest: arguments.mailboxRequest
));
break;
}
}
@@ -1884,51 +1864,6 @@ class MailboxDashBoardController extends ReloadableController {
}
}
void _showConfirmDialogStoreSendingEmail(
Session session,
AccountId accountId,
EmailRequest emailRequest,
CreateNewMailboxRequest? mailboxRequest
) {
showConfirmDialogAction(
currentContext!,
'',
AppLocalizations.of(currentContext!).proceed,
onConfirmAction: () {
_handleStoreSendingEmail(session, accountId, emailRequest, mailboxRequest);
},
title: AppLocalizations.of(currentContext!).youAreInOfflineMode,
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode),
alignCenter: true,
messageStyle: const TextStyle(
color: AppColor.colorTitleSendingItem,
fontSize: 15,
fontWeight: FontWeight.normal
),
listTextSpan: [
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst),
TextSpan(
text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond,
style: const TextStyle(
color: AppColor.colorTitleSendingItem,
fontSize: 15,
fontWeight: FontWeight.w600
),
),
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird),
TextSpan(
text: AppLocalizations.of(currentContext!).sendingQueue,
style: const TextStyle(
color: AppColor.colorTitleSendingItem,
fontSize: 15,
fontWeight: FontWeight.w600
),
),
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail)
]
);
}
void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) {
addSendingEmailToSendingQueue(success.sendingEmail);
getAllSendingEmails();
@@ -2124,7 +2059,7 @@ class MailboxDashBoardController extends ReloadableController {
void disableDraggableApp() {
draggableAppState.value = DraggableAppState.inActive;
}
@override
void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream();
@@ -1,8 +1,8 @@
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
class SendingEmailArguments extends RouterArguments {
@@ -10,7 +10,7 @@ class SendingEmailArguments extends RouterArguments {
final AccountId accountId;
final EmailRequest emailRequest;
final CreateNewMailboxRequest? mailboxRequest;
final SendingEmailActionType sendingEmailActionType;
final ComposeActionMode actionMode;
SendingEmailArguments(
this.session,
@@ -18,7 +18,7 @@ class SendingEmailArguments extends RouterArguments {
this.emailRequest,
this.mailboxRequest,
{
this.sendingEmailActionType = SendingEmailActionType.create
this.actionMode = ComposeActionMode.sent
}
);
@@ -28,6 +28,6 @@ class SendingEmailArguments extends RouterArguments {
accountId,
emailRequest,
mailboxRequest,
sendingEmailActionType
actionMode
];
}