TF-1915 SendingState of SendingEmail updates according to the work done in WorkManager when network connectivity is restored
(cherry picked from commit 744c8bc8dc8a82cb3afb75aead5a744adaae5501)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
|
||||
|
||||
extension EmailRequestExtension on EmailRequest {
|
||||
SendingEmail toSendingEmail(String sendingId, {CreateNewMailboxRequest? mailboxRequest}) {
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/extensions/email_id_extensions.dart';
|
||||
import 'package:model/extensions/identity_id_extension.dart';
|
||||
import 'package:model/extensions/mailbox_id_extension.dart';
|
||||
import 'package:model/mailbox/select_mode.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
||||
import 'package:tmail_ui_user/features/offline_mode/model/sending_email_hive_cache.dart';
|
||||
|
||||
extension SendingEmailExtension on SendingEmail {
|
||||
SendingEmailHiveCache toHiveCache() {
|
||||
return SendingEmailHiveCache(
|
||||
sendingId,
|
||||
email.asString(),
|
||||
emailActionType.name,
|
||||
createTime,
|
||||
sentMailboxId?.asString,
|
||||
emailIdDestroyed?.asString,
|
||||
emailIdAnsweredOrForwarded?.asString,
|
||||
identityId?.asString,
|
||||
mailboxNameRequest?.name,
|
||||
creationIdRequest?.value,
|
||||
sendingState.name,
|
||||
);
|
||||
}
|
||||
|
||||
EmailRequest toEmailRequest({Email? emailEdit}) {
|
||||
return EmailRequest(
|
||||
email: emailEdit ?? email,
|
||||
emailActionType: emailActionType,
|
||||
sentMailboxId: sentMailboxId,
|
||||
emailIdDestroyed: emailIdDestroyed,
|
||||
emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded,
|
||||
identityId: identityId
|
||||
);
|
||||
}
|
||||
|
||||
SendingEmail toggleSelection() {
|
||||
return SendingEmail(
|
||||
sendingId: sendingId,
|
||||
email: email,
|
||||
emailActionType: emailActionType,
|
||||
createTime: createTime,
|
||||
sentMailboxId: sentMailboxId,
|
||||
emailIdDestroyed: emailIdDestroyed,
|
||||
emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded,
|
||||
identityId: identityId,
|
||||
mailboxNameRequest: mailboxNameRequest,
|
||||
creationIdRequest: creationIdRequest,
|
||||
sendingState: sendingState,
|
||||
selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE
|
||||
);
|
||||
}
|
||||
|
||||
SendingEmail unSelected() {
|
||||
return SendingEmail(
|
||||
sendingId: sendingId,
|
||||
email: email,
|
||||
emailActionType: emailActionType,
|
||||
createTime: createTime,
|
||||
sentMailboxId: sentMailboxId,
|
||||
emailIdDestroyed: emailIdDestroyed,
|
||||
emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded,
|
||||
identityId: identityId,
|
||||
mailboxNameRequest: mailboxNameRequest,
|
||||
creationIdRequest: creationIdRequest,
|
||||
sendingState: sendingState,
|
||||
selectMode: SelectMode.INACTIVE
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ class EmailRequest with EquatableMixin {
|
||||
final EmailId? emailIdAnsweredOrForwarded;
|
||||
final IdentityId? identityId;
|
||||
final EmailActionType emailActionType;
|
||||
final String? storedSendingId;
|
||||
|
||||
EmailRequest({
|
||||
required this.email,
|
||||
@@ -21,6 +22,7 @@ class EmailRequest with EquatableMixin {
|
||||
this.identityId,
|
||||
this.emailIdDestroyed,
|
||||
this.emailIdAnsweredOrForwarded,
|
||||
this.storedSendingId,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -30,7 +32,8 @@ class EmailRequest with EquatableMixin {
|
||||
identityId,
|
||||
emailIdDestroyed,
|
||||
emailIdAnsweredOrForwarded,
|
||||
emailActionType
|
||||
emailActionType,
|
||||
storedSendingId,
|
||||
];
|
||||
|
||||
bool get isEmailAnswered => emailIdAnsweredOrForwarded != null &&
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
import 'dart:convert';
|
||||
import 'package:core/domain/extensions/datetime_extension.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_date_range_picker/flutter_date_range_picker.dart';
|
||||
import 'package:jmap_dart_client/http/converter/email_id_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/id_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/identities/identity_id_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/mailbox_id_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/mailbox_name_converter.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/email/email_action_type.dart';
|
||||
import 'package:model/email/presentation_email.dart';
|
||||
import 'package:model/extensions/email_extension.dart';
|
||||
import 'package:model/mailbox/select_mode.dart';
|
||||
import 'package:tmail_ui_user/features/offline_mode/model/sending_state.dart';
|
||||
|
||||
class SendingEmail with EquatableMixin {
|
||||
final String sendingId;
|
||||
final Email email;
|
||||
final MailboxId? sentMailboxId;
|
||||
final EmailId? emailIdDestroyed;
|
||||
final EmailId? emailIdAnsweredOrForwarded;
|
||||
final IdentityId? identityId;
|
||||
final EmailActionType emailActionType;
|
||||
final MailboxName? mailboxNameRequest;
|
||||
final Id? creationIdRequest;
|
||||
final DateTime createTime;
|
||||
final SelectMode selectMode;
|
||||
final SendingState sendingState;
|
||||
|
||||
SendingEmail({
|
||||
required this.sendingId,
|
||||
required this.email,
|
||||
required this.emailActionType,
|
||||
required this.createTime,
|
||||
this.sentMailboxId,
|
||||
this.emailIdDestroyed,
|
||||
this.emailIdAnsweredOrForwarded,
|
||||
this.identityId,
|
||||
this.mailboxNameRequest,
|
||||
this.creationIdRequest,
|
||||
this.selectMode = SelectMode.INACTIVE,
|
||||
this.sendingState = SendingState.ready
|
||||
});
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final val = <String, dynamic>{};
|
||||
|
||||
void writeNotNull(String key, dynamic value) {
|
||||
if (value != null) {
|
||||
val[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
writeNotNull('sendingId', sendingId);
|
||||
writeNotNull('email', email.asString());
|
||||
writeNotNull('emailActionType', emailActionType.name);
|
||||
writeNotNull('createTime', createTime.toIso8601String());
|
||||
writeNotNull('sentMailboxId', const MailboxIdNullableConverter().toJson(sentMailboxId));
|
||||
writeNotNull('emailIdDestroyed', const EmailIdNullableConverter().toJson(emailIdDestroyed));
|
||||
writeNotNull('emailIdAnsweredOrForwarded', const EmailIdNullableConverter().toJson(emailIdAnsweredOrForwarded));
|
||||
writeNotNull('identityId', const IdentityIdNullableConverter().toJson(identityId));
|
||||
writeNotNull('mailboxNameRequest', mailboxNameRequest?.name);
|
||||
writeNotNull('creationIdRequest', const IdNullableConverter().toJson(creationIdRequest));
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
PresentationEmail get presentationEmail => email.sendingEmailToPresentationEmail();
|
||||
|
||||
String getCreateTimeAt(String newLocale) {
|
||||
return DateFormat(createTime.toPattern(), newLocale).format(createTime);
|
||||
}
|
||||
|
||||
factory SendingEmail.fromJson(Map<String, dynamic> json) {
|
||||
return SendingEmail(
|
||||
sendingId: json['sendingId'] as String,
|
||||
email: Email.fromJson(jsonDecode(json['email'])),
|
||||
emailActionType: _getEmailActionType(json['emailActionType'] as String),
|
||||
createTime: DateTime.parse(json['createTime'] as String),
|
||||
sentMailboxId: const MailboxIdNullableConverter().fromJson(json['sentMailboxId'] as String?),
|
||||
emailIdDestroyed: const EmailIdNullableConverter().fromJson(json['emailIdDestroyed'] as String?),
|
||||
emailIdAnsweredOrForwarded: const EmailIdNullableConverter().fromJson(json['emailIdAnsweredOrForwarded'] as String?),
|
||||
identityId: const IdentityIdNullableConverter().fromJson(json['identityId'] as String?),
|
||||
mailboxNameRequest: const MailboxNameConverter().fromJson(json['mailboxNameRequest'] as String?),
|
||||
creationIdRequest: const IdNullableConverter().fromJson(json['creationIdRequest'] as String?),
|
||||
);
|
||||
}
|
||||
|
||||
static EmailActionType _getEmailActionType(String value) {
|
||||
return EmailActionType.values.firstWhere(
|
||||
(type) => type.name == value,
|
||||
orElse: () => throw ArgumentError('Invalid email action type: $value'),
|
||||
);
|
||||
}
|
||||
|
||||
bool get isSelected => selectMode == SelectMode.ACTIVE;
|
||||
|
||||
bool get isDelivering => sendingState == SendingState.delivering;
|
||||
|
||||
bool get isReady => sendingState == SendingState.ready;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
sendingId,
|
||||
email,
|
||||
emailActionType,
|
||||
createTime,
|
||||
sentMailboxId,
|
||||
emailIdDestroyed,
|
||||
emailIdAnsweredOrForwarded,
|
||||
identityId,
|
||||
mailboxNameRequest,
|
||||
creationIdRequest,
|
||||
selectMode,
|
||||
sendingState,
|
||||
];
|
||||
}
|
||||
@@ -1,13 +1,9 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||
|
||||
class SendingEmailState extends UIState {
|
||||
SendingEmailState();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
class SendEmailLoading extends UIState {}
|
||||
|
||||
class SendEmailSuccess extends UIActionState {
|
||||
|
||||
@@ -21,9 +17,8 @@ class SendEmailSuccess extends UIActionState {
|
||||
}
|
||||
|
||||
class SendEmailFailure extends FeatureFailure {
|
||||
final dynamic exception;
|
||||
|
||||
SendEmailFailure(this.exception);
|
||||
SendEmailFailure(dynamic exception) : super(exception: exception);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [exception];
|
||||
|
||||
@@ -22,7 +22,7 @@ class SendEmailInteractor {
|
||||
{CreateNewMailboxRequest? mailboxRequest}
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(SendingEmailState());
|
||||
yield Right<Failure, Success>(SendEmailLoading());
|
||||
|
||||
final listState = await Future.wait([
|
||||
_mailboxRepository.getMailboxState(session, accountId),
|
||||
|
||||
@@ -33,7 +33,6 @@ import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
import 'package:rich_text_composer/rich_text_composer.dart';
|
||||
import 'package:super_tag_editor/tag_editor.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/extensions/sending_email_extension.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/state/download_image_as_base64_state.dart';
|
||||
@@ -49,7 +48,6 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/email_ac
|
||||
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/screen_display_mode.dart';
|
||||
import 'package:tmail_ui_user/features/composer/presentation/model/sending_email_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||
@@ -61,6 +59,9 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_ident
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||
import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart';
|
||||
import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.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/upload/domain/model/upload_task_id.dart';
|
||||
import 'package:tmail_ui_user/features/upload/domain/state/attachment_upload_state.dart';
|
||||
import 'package:tmail_ui_user/features/upload/domain/state/local_file_picker_state.dart';
|
||||
@@ -615,8 +616,7 @@ class ComposerController extends BaseController {
|
||||
{
|
||||
bool asDrafts = false,
|
||||
MailboxId? draftMailboxId,
|
||||
MailboxId? outboxMailboxId,
|
||||
ComposerArguments? arguments
|
||||
MailboxId? outboxMailboxId
|
||||
}
|
||||
) async {
|
||||
Set<EmailAddress> listFromEmailAddress = {EmailAddress(null, userProfile.email)};
|
||||
@@ -663,10 +663,7 @@ class ComposerController extends BaseController {
|
||||
|
||||
final generatePartId = PartId(_uuid.v1());
|
||||
|
||||
final isUpdateSendingEmail = arguments?.sendingEmail != null;
|
||||
|
||||
return Email(
|
||||
id: isUpdateSendingEmail ? EmailId(Id(arguments!.sendingEmail!.sendingId)) : null,
|
||||
mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null,
|
||||
from: listFromEmailAddress,
|
||||
to: listToEmailAddress.toSet(),
|
||||
@@ -804,11 +801,11 @@ class ComposerController extends BaseController {
|
||||
final userProfile = mailboxDashBoardController.userProfile.value;
|
||||
|
||||
if (arguments != null && accountId != null && userProfile != null && session != null) {
|
||||
final email = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId, arguments: arguments);
|
||||
final createdEmail = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId);
|
||||
final emailRequest = arguments.sendingEmail != null
|
||||
? arguments.sendingEmail!.toEmailRequest(emailEdit: email)
|
||||
? arguments.sendingEmail!.toEmailRequest(newEmail: createdEmail)
|
||||
: EmailRequest(
|
||||
email: email,
|
||||
email: createdEmail,
|
||||
sentMailboxId: sentMailboxId,
|
||||
identityId: identitySelected.value?.id,
|
||||
emailIdDestroyed: arguments.emailActionType == EmailActionType.edit
|
||||
@@ -826,7 +823,9 @@ class ComposerController extends BaseController {
|
||||
accountId,
|
||||
emailRequest,
|
||||
mailboxRequest,
|
||||
isUpdateSendingEmail: arguments.sendingEmail != null,
|
||||
sendingEmailActionType: arguments.sendingEmail != null
|
||||
? SendingEmailActionType.edit
|
||||
: SendingEmailActionType.create,
|
||||
);
|
||||
uploadController.clearInlineFileUploaded();
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
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/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
||||
|
||||
class SendingEmailArguments extends RouterArguments {
|
||||
final Session session;
|
||||
final AccountId accountId;
|
||||
final EmailRequest emailRequest;
|
||||
final CreateNewMailboxRequest? mailboxRequest;
|
||||
final bool? isUpdateSendingEmail;
|
||||
|
||||
SendingEmailArguments(
|
||||
this.session,
|
||||
this.accountId,
|
||||
this.emailRequest,
|
||||
this.mailboxRequest,
|
||||
{
|
||||
this.isUpdateSendingEmail
|
||||
}
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [session, accountId, emailRequest, mailboxRequest, isUpdateSendingEmail];
|
||||
}
|
||||
Reference in New Issue
Block a user