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/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/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/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/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/image_source.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.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) ? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
: null; : null;
final sendingEmailArguments = SendingEmailArguments( if (PlatformInfo.isMobile && !networkConnectionController.isNetworkConnectionAvailable()) {
session, switch(arguments.sendingEmailActionType) {
accountId, case SendingEmailActionType.create:
emailRequest, _showConfirmDialogStoreSendingEmail(
mailboxRequest, SendingEmailArguments(
sendingEmailActionType: arguments.sendingEmail != null session,
? SendingEmailActionType.edit accountId,
: SendingEmailActionType.create, emailRequest,
); mailboxRequest,
uploadController.clearInlineFileUploaded(); actionMode: ComposeActionMode.pushQueue
)
if (PlatformInfo.isWeb) { );
closeComposerWeb(result: sendingEmailArguments); 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 { } else {
popBack(result: sendingEmailArguments); uploadController.clearInlineFileUploaded();
_closeComposerAction(
result: SendingEmailArguments(
session,
accountId,
emailRequest,
mailboxRequest,
)
);
} }
} else { } else {
if (PlatformInfo.isWeb) { logError('ComposerController::_handleSendMessages: arguments/accountId/userProfile/session is NULL');
closeComposerWeb(); uploadController.clearInlineFileUploaded();
} else { _closeComposerAction();
popBack();
}
} }
} }
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 { void _checkContactPermission() async {
final permissionStatus = await Permission.contacts.status; final permissionStatus = await Permission.contacts.status;
if (permissionStatus.isGranted) { if (permissionStatus.isGranted) {
@@ -1369,7 +1440,15 @@ class ComposerController extends BaseController {
FocusScope.of(context).unfocus(); 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(); FocusManager.instance.primaryFocus?.unfocus();
mailboxDashBoardController.closeComposerOverlay(result: result); 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: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/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/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'; import 'package:tmail_ui_user/main/routes/router_arguments.dart';
class ComposerArguments extends RouterArguments { class ComposerArguments extends RouterArguments {
@@ -131,6 +132,10 @@ class ComposerArguments extends RouterArguments {
references: references, references: references,
); );
SendingEmailActionType get sendingEmailActionType => sendingEmail != null
? SendingEmailActionType.edit
: SendingEmailActionType.create;
@override @override
List<Object?> get props => [ List<Object?> get props => [
emailActionType, 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/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/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/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/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/mark_as_email_read_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_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/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/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/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/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/session/domain/usecases/store_session_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.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 && if (PlatformInfo.isMobile &&
failure is SendEmailFailure && failure is SendEmailFailure &&
exception is NoNetworkError) { exception is NoNetworkError) {
_handleSendingEmailWhenNoNetwork( if (failure.emailRequest.storedSendingId != null) {
failure.session, _handleStoreSendingEmail(
failure.accountId, failure.session,
failure.emailRequest, failure.accountId,
failure.mailboxRequest, failure.emailRequest,
failure.sendingEmailActionType failure.mailboxRequest
); );
} else {
_handleUpdateSendingEmail(
failure.session,
failure.accountId,
failure.emailRequest,
failure.mailboxRequest
);
}
} }
} }
@@ -1243,13 +1251,7 @@ class MailboxDashBoardController extends ReloadableController {
composerOverlayState.value = ComposerOverlayState.inActive; composerOverlayState.value = ComposerOverlayState.inActive;
if (result is SendingEmailArguments) { if (result is SendingEmailArguments) {
handleSendEmailAction( handleSendEmailAction(result);
result.session,
result.accountId,
result.emailRequest,
result.mailboxRequest,
result.sendingEmailActionType
);
} }
} }
@@ -1361,13 +1363,7 @@ class MailboxDashBoardController extends ReloadableController {
} else { } else {
final result = await push(AppRoutes.composer, arguments: arguments); final result = await push(AppRoutes.composer, arguments: arguments);
if (result is SendingEmailArguments) { if (result is SendingEmailArguments) {
handleSendEmailAction( handleSendEmailAction(result);
result.session,
result.accountId,
result.emailRequest,
result.mailboxRequest,
result.sendingEmailActionType
);
} }
} }
} }
@@ -1806,47 +1802,31 @@ class MailboxDashBoardController extends ReloadableController {
clearState(); clearState();
} }
void handleSendEmailAction( void handleSendEmailAction(SendingEmailArguments arguments) {
Session session, switch(arguments.actionMode) {
AccountId accountId, case ComposeActionMode.pushQueue:
EmailRequest emailRequest, _handleStoreSendingEmail(
CreateNewMailboxRequest? mailboxRequest, arguments.session,
SendingEmailActionType sendingEmailActionType arguments.accountId,
) { arguments.emailRequest,
if (PlatformInfo.isWeb || arguments.mailboxRequest
(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);
break; break;
case SendingEmailActionType.edit: case ComposeActionMode.editQueue:
_handleUpdateSendingEmail(session, accountId, emailRequest, mailboxRequest); _handleUpdateSendingEmail(
arguments.session,
arguments.accountId,
arguments.emailRequest,
arguments.mailboxRequest
);
break; break;
default: case ComposeActionMode.sent:
consumeState(_sendEmailInteractor.execute(
arguments.session,
arguments.accountId,
arguments.emailRequest,
mailboxRequest: arguments.mailboxRequest
));
break; 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) { void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) {
addSendingEmailToSendingQueue(success.sendingEmail); addSendingEmailToSendingQueue(success.sendingEmail);
getAllSendingEmails(); getAllSendingEmails();
@@ -2124,7 +2059,7 @@ class MailboxDashBoardController extends ReloadableController {
void disableDraggableApp() { void disableDraggableApp() {
draggableAppState.value = DraggableAppState.inActive; draggableAppState.value = DraggableAppState.inActive;
} }
@override @override
void onClose() { void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream(); _emailReceiveManager.closeEmailReceiveManagerStream();
@@ -1,8 +1,8 @@
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.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/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/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'; import 'package:tmail_ui_user/main/routes/router_arguments.dart';
class SendingEmailArguments extends RouterArguments { class SendingEmailArguments extends RouterArguments {
@@ -10,7 +10,7 @@ class SendingEmailArguments extends RouterArguments {
final AccountId accountId; final AccountId accountId;
final EmailRequest emailRequest; final EmailRequest emailRequest;
final CreateNewMailboxRequest? mailboxRequest; final CreateNewMailboxRequest? mailboxRequest;
final SendingEmailActionType sendingEmailActionType; final ComposeActionMode actionMode;
SendingEmailArguments( SendingEmailArguments(
this.session, this.session,
@@ -18,7 +18,7 @@ class SendingEmailArguments extends RouterArguments {
this.emailRequest, this.emailRequest,
this.mailboxRequest, this.mailboxRequest,
{ {
this.sendingEmailActionType = SendingEmailActionType.create this.actionMode = ComposeActionMode.sent
} }
); );
@@ -28,6 +28,6 @@ class SendingEmailArguments extends RouterArguments {
accountId, accountId,
emailRequest, emailRequest,
mailboxRequest, mailboxRequest,
sendingEmailActionType actionMode
]; ];
} }