TF-561 Fix edit identity
This commit is contained in:
@@ -2,28 +2,53 @@ import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||
import 'package:jmap_dart_client/http/http_client.dart' as jmap_http_client;
|
||||
|
||||
class IdentityCreatorBindings extends BaseBindings {
|
||||
|
||||
@override
|
||||
void bindingsController() {
|
||||
Get.lazyPut(() => IdentityCreatorController(Get.find<VerifyNameInteractor>()));
|
||||
void dependencies() {
|
||||
Get.lazyPut(() => ManageAccountAPI(Get.find<jmap_http_client.HttpClient>()));
|
||||
super.dependencies();
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {}
|
||||
void bindingsController() {
|
||||
Get.lazyPut(() => IdentityCreatorController(
|
||||
Get.find<VerifyNameInteractor>(),
|
||||
Get.find<GetAllIdentitiesInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {}
|
||||
void bindingsDataSource() {
|
||||
Get.lazyPut<ManageAccountDataSource>(() => Get.find<ManageAccountDataSourceImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {
|
||||
Get.lazyPut(() => ManageAccountDataSourceImpl(Get.find<ManageAccountAPI>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.lazyPut(() => VerifyNameInteractor());
|
||||
Get.lazyPut(() => GetAllIdentitiesInteractor(Get.find<ManageAccountRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {}
|
||||
void bindingsRepository() {
|
||||
Get.lazyPut<ManageAccountRepository>(() => Get.find<ManageAccountRepositoryImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {}
|
||||
void bindingsRepositoryImpl() {
|
||||
Get.lazyPut(() => ManageAccountRepositoryImpl(Get.find<ManageAccountDataSource>()));
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:html_editor_enhanced/html_editor.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:model/model.dart';
|
||||
@@ -14,12 +15,15 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
|
||||
class IdentityCreatorController extends BaseController {
|
||||
|
||||
final VerifyNameInteractor _verifyNameInteractor;
|
||||
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
|
||||
|
||||
final noneEmailAddress = EmailAddress(null, 'None');
|
||||
final signatureType = SignatureType.plainText.obs;
|
||||
@@ -29,6 +33,7 @@ class IdentityCreatorController extends BaseController {
|
||||
final emailOfIdentity = Rxn<EmailAddress>();
|
||||
final replyToOfIdentity = Rxn<EmailAddress>();
|
||||
final bccOfIdentity = Rxn<EmailAddress>();
|
||||
final actionType = IdentityActionType.create.obs;
|
||||
|
||||
final HtmlEditorController signatureHtmlEditorController = HtmlEditorController(processNewLineAsBr: true);
|
||||
final TextEditingController signaturePlainEditorController = TextEditingController();
|
||||
@@ -37,7 +42,6 @@ class IdentityCreatorController extends BaseController {
|
||||
|
||||
AccountId? accountId;
|
||||
UserProfile? userProfile;
|
||||
IdentityActionType? actionType;
|
||||
Identity? identity;
|
||||
String? _nameIdentity;
|
||||
String? _contentHtmlEditor;
|
||||
@@ -51,15 +55,17 @@ class IdentityCreatorController extends BaseController {
|
||||
|
||||
String? get contentHtmlEditor => _contentHtmlEditor;
|
||||
|
||||
IdentityCreatorController(this._verifyNameInteractor);
|
||||
IdentityCreatorController(
|
||||
this._verifyNameInteractor,
|
||||
this._getAllIdentitiesInteractor
|
||||
);
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
_getArguments();
|
||||
if (actionType == IdentityActionType.edit && identity != null) {
|
||||
_getAllIdentities();
|
||||
if (actionType.value == IdentityActionType.edit && identity != null) {
|
||||
_setUpValueFromIdentity();
|
||||
} else {
|
||||
_setDefaultValueForIdentity();
|
||||
}
|
||||
super.onReady();
|
||||
}
|
||||
@@ -74,6 +80,18 @@ class IdentityCreatorController extends BaseController {
|
||||
|
||||
@override
|
||||
void onDone() {
|
||||
viewState.value.fold(
|
||||
(failure) {
|
||||
if (failure is GetAllIdentitiesFailure) {
|
||||
_getALlIdentitiesFailure(failure);
|
||||
}
|
||||
},
|
||||
(success) {
|
||||
if (success is GetAllIdentitiesSuccess) {
|
||||
_getALlIdentitiesSuccess(success);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -84,55 +102,15 @@ class IdentityCreatorController extends BaseController {
|
||||
if (arguments is IdentityCreatorArguments) {
|
||||
accountId = arguments.accountId;
|
||||
userProfile = arguments.userProfile;
|
||||
actionType = arguments.actionType;
|
||||
actionType.value = arguments.actionType;
|
||||
identity = arguments.identity;
|
||||
}
|
||||
}
|
||||
|
||||
void _setDefaultValueForIdentity() {
|
||||
listEmailAddressOfReplyTo.add(noneEmailAddress);
|
||||
bccOfIdentity.value = noneEmailAddress;
|
||||
replyToOfIdentity.value = noneEmailAddress;
|
||||
|
||||
if (userProfile != null && userProfile?.email.isNotEmpty == true) {
|
||||
final userEmailAddress = EmailAddress(null, userProfile!.email);
|
||||
listEmailAddressDefault.add(userEmailAddress);
|
||||
listEmailAddressOfReplyTo.add(userEmailAddress);
|
||||
emailOfIdentity.value = userEmailAddress;
|
||||
}
|
||||
}
|
||||
|
||||
void _setUpValueFromIdentity() {
|
||||
Set<EmailAddress> listEmailAddress = {};
|
||||
listEmailAddress.add(noneEmailAddress);
|
||||
|
||||
_nameIdentity = identity?.name ?? '';
|
||||
inputNameIdentityController.text = identity?.name ?? '';
|
||||
|
||||
if (identity?.replyTo?.isNotEmpty == true) {
|
||||
replyToOfIdentity.value = identity!.replyTo!.first;
|
||||
listEmailAddress.add(identity!.replyTo!.first);
|
||||
} else {
|
||||
replyToOfIdentity.value = noneEmailAddress;
|
||||
}
|
||||
|
||||
if (identity?.bcc?.isNotEmpty == true) {
|
||||
bccOfIdentity.value = identity!.bcc!.first;
|
||||
listEmailAddress.add(identity!.bcc!.first);
|
||||
} else {
|
||||
bccOfIdentity.value = noneEmailAddress;
|
||||
}
|
||||
|
||||
if (identity?.email?.isNotEmpty == true) {
|
||||
emailOfIdentity.value = EmailAddress(null, identity?.email!);
|
||||
listEmailAddress.add(EmailAddress(null, identity?.email!));
|
||||
}
|
||||
|
||||
listEmailAddressOfReplyTo.value = listEmailAddress.toList();
|
||||
listEmailAddressDefault.value = listEmailAddress
|
||||
.where((emailAddress) => emailAddress != noneEmailAddress)
|
||||
.toList();
|
||||
|
||||
if (identity?.textSignature?.value.isNotEmpty == true) {
|
||||
signaturePlainEditorController.text = identity?.textSignature?.value ?? '';
|
||||
}
|
||||
@@ -143,6 +121,72 @@ class IdentityCreatorController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
void _getAllIdentities() {
|
||||
if (accountId != null) {
|
||||
consumeState(_getAllIdentitiesInteractor.execute(
|
||||
accountId!,
|
||||
properties: Properties({'email'})
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
void _getALlIdentitiesSuccess(GetAllIdentitiesSuccess success) {
|
||||
if (success.identities?.isNotEmpty == true) {
|
||||
listEmailAddressDefault.value = success.identities
|
||||
!.map((identity) => identity.toEmailAddressNoName())
|
||||
.toSet()
|
||||
.toList();
|
||||
listEmailAddressOfReplyTo.add(noneEmailAddress);
|
||||
listEmailAddressOfReplyTo.addAll(listEmailAddressDefault);
|
||||
|
||||
_setUpAllFieldEmailAddress();
|
||||
} else {
|
||||
_setDefaultEmailAddressList();
|
||||
}
|
||||
}
|
||||
|
||||
void _getALlIdentitiesFailure(GetAllIdentitiesFailure failure) {
|
||||
_setDefaultEmailAddressList();
|
||||
}
|
||||
|
||||
void _setDefaultEmailAddressList() {
|
||||
listEmailAddressOfReplyTo.add(noneEmailAddress);
|
||||
|
||||
if (userProfile != null && userProfile?.email.isNotEmpty == true) {
|
||||
final userEmailAddress = EmailAddress(null, userProfile!.email);
|
||||
listEmailAddressDefault.add(userEmailAddress);
|
||||
listEmailAddressOfReplyTo.addAll(listEmailAddressDefault);
|
||||
}
|
||||
|
||||
_setUpAllFieldEmailAddress();
|
||||
}
|
||||
|
||||
void _setUpAllFieldEmailAddress() {
|
||||
if (actionType.value == IdentityActionType.edit && identity != null) {
|
||||
replyToOfIdentity.value = identity?.replyTo?.isNotEmpty == true
|
||||
? identity!.replyTo!.first
|
||||
: noneEmailAddress;
|
||||
|
||||
bccOfIdentity.value = identity?.bcc?.isNotEmpty == true
|
||||
? identity!.bcc!.first
|
||||
: noneEmailAddress;
|
||||
|
||||
if (identity?.email?.isNotEmpty == true) {
|
||||
emailOfIdentity.value = EmailAddress(null, identity?.email!);
|
||||
} else {
|
||||
emailOfIdentity.value = listEmailAddressDefault.isNotEmpty
|
||||
? listEmailAddressDefault.first
|
||||
: null;
|
||||
}
|
||||
} else {
|
||||
replyToOfIdentity.value = noneEmailAddress;
|
||||
bccOfIdentity.value = noneEmailAddress;
|
||||
emailOfIdentity.value = listEmailAddressDefault.isNotEmpty
|
||||
? listEmailAddressDefault.first
|
||||
: null;
|
||||
}
|
||||
}
|
||||
|
||||
void selectSignatureType(SignatureType newSignatureType) {
|
||||
signatureType.value = newSignatureType;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:html_editor_enhanced/html_editor.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/model/signature_type.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_drop_list_field_builder.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_field_no_editable_builder.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/widgets/identity_input_field_builder.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
@@ -105,8 +106,13 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24, top: 24),
|
||||
child: Text(AppLocalizations.of(context).new_identity.inCaps,
|
||||
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 24, color: Colors.black))),
|
||||
child: Obx(() => Text(controller.actionType.value == IdentityActionType.create
|
||||
? AppLocalizations.of(context).new_identity.inCaps
|
||||
: AppLocalizations.of(context).edit_identity.inCaps,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 24,
|
||||
color: Colors.black)))),
|
||||
const SizedBox(height: 8),
|
||||
Expanded(child: SingleChildScrollView(
|
||||
physics: const ClampingScrollPhysics(),
|
||||
@@ -115,8 +121,6 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
child: Column(children: [
|
||||
Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
Expanded(child: Obx(() => (IdentityInputFieldBuilder(
|
||||
context,
|
||||
_responsiveUtils,
|
||||
AppLocalizations.of(context).name,
|
||||
controller.errorNameIdentity.value,
|
||||
editingController: controller.inputNameIdentityController,
|
||||
@@ -125,14 +129,23 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
..addOnChangeInputNameAction((value) => controller.updateNameIdentity(context, value)))
|
||||
.build())),
|
||||
const SizedBox(width: 24),
|
||||
Expanded(child: Obx(() => (IdentityDropListFieldBuilder(
|
||||
_imagePaths,
|
||||
Expanded(child: Obx(() {
|
||||
if (controller.actionType.value == IdentityActionType.create) {
|
||||
return (IdentityDropListFieldBuilder(
|
||||
_imagePaths,
|
||||
AppLocalizations.of(context).email.inCaps,
|
||||
controller.emailOfIdentity.value,
|
||||
controller.listEmailAddressDefault)
|
||||
..addOnSelectEmailAddressDropListAction((emailAddress) =>
|
||||
controller.updateEmailOfIdentity(emailAddress))
|
||||
).build();
|
||||
} else {
|
||||
return IdentityFieldNoEditableBuilder(
|
||||
AppLocalizations.of(context).email.inCaps,
|
||||
controller.emailOfIdentity.value,
|
||||
controller.listEmailAddressDefault)
|
||||
..addOnSelectEmailAddressDropListAction((emailAddress) =>
|
||||
controller.updateEmailOfIdentity(emailAddress)))
|
||||
.build())),
|
||||
controller.emailOfIdentity.value
|
||||
).build();
|
||||
}
|
||||
})),
|
||||
]),
|
||||
const SizedBox(height: 24),
|
||||
Row(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
@@ -265,12 +278,14 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
radius: 10,
|
||||
onTap: () => controller.closeView(context)),
|
||||
const SizedBox(width: 12),
|
||||
buildTextButton(
|
||||
AppLocalizations.of(context).create,
|
||||
Obx(() => buildTextButton(
|
||||
controller.actionType.value == IdentityActionType.create
|
||||
? AppLocalizations.of(context).create
|
||||
: AppLocalizations.of(context).save,
|
||||
width: 128,
|
||||
height: 44,
|
||||
radius: 10,
|
||||
onTap: () => controller.createNewIdentity(context)),
|
||||
onTap: () => controller.createNewIdentity(context))),
|
||||
]
|
||||
),
|
||||
)
|
||||
@@ -299,8 +314,6 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
padding: const EdgeInsets.all(24.0),
|
||||
child: Column(children: [
|
||||
Obx(() => (IdentityInputFieldBuilder(
|
||||
context,
|
||||
_responsiveUtils,
|
||||
AppLocalizations.of(context).name,
|
||||
controller.errorNameIdentity.value,
|
||||
editingController: controller.inputNameIdentityController,
|
||||
@@ -309,14 +322,23 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
..addOnChangeInputNameAction((value) => controller.updateNameIdentity(context, value)))
|
||||
.build()),
|
||||
const SizedBox(height: 24),
|
||||
Obx(() => (IdentityDropListFieldBuilder(
|
||||
_imagePaths,
|
||||
Obx(() {
|
||||
if (controller.actionType.value == IdentityActionType.create) {
|
||||
return (IdentityDropListFieldBuilder(
|
||||
_imagePaths,
|
||||
AppLocalizations.of(context).email.inCaps,
|
||||
controller.emailOfIdentity.value,
|
||||
controller.listEmailAddressDefault)
|
||||
..addOnSelectEmailAddressDropListAction((emailAddress) =>
|
||||
controller.updateEmailOfIdentity(emailAddress))
|
||||
).build();
|
||||
} else {
|
||||
return IdentityFieldNoEditableBuilder(
|
||||
AppLocalizations.of(context).email.inCaps,
|
||||
controller.emailOfIdentity.value,
|
||||
controller.listEmailAddressDefault)
|
||||
..addOnSelectEmailAddressDropListAction((emailAddress) =>
|
||||
controller.updateEmailOfIdentity(emailAddress)))
|
||||
.build()),
|
||||
controller.emailOfIdentity.value
|
||||
).build();
|
||||
}
|
||||
}),
|
||||
const SizedBox(height: 24),
|
||||
Obx(() => (IdentityDropListFieldBuilder(
|
||||
_imagePaths,
|
||||
@@ -446,7 +468,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: Obx(() => buildTextButton(
|
||||
controller.actionType == IdentityActionType.create
|
||||
controller.actionType.value == IdentityActionType.create
|
||||
? AppLocalizations.of(context).create
|
||||
: AppLocalizations.of(context).save,
|
||||
width: 128,
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
|
||||
class IdentityFieldNoEditableBuilder {
|
||||
|
||||
final String _label;
|
||||
final EmailAddress? _emailAddressSelected;
|
||||
|
||||
IdentityFieldNoEditableBuilder(this._label, this._emailAddressSelected);
|
||||
|
||||
Widget build() {
|
||||
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
Text(_label, style: const TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.normal,
|
||||
color: AppColor.colorContentEmail)),
|
||||
const SizedBox(height: 8),
|
||||
Container(
|
||||
height: 44,
|
||||
alignment: Alignment.center,
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(color: AppColor.colorInputBorderCreateMailbox, width: 0.5),
|
||||
color: AppColor.colorInputBackgroundCreateMailbox),
|
||||
child: Text(
|
||||
_emailAddressSelected?.email ?? '',
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
color: AppColor.colorInputBorderCreateMailbox),
|
||||
maxLines: 1,
|
||||
overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis,
|
||||
)
|
||||
),
|
||||
]);
|
||||
}
|
||||
}
|
||||
+2
-6
@@ -7,8 +7,6 @@ typedef OnChangeInputNameAction = Function(String? value);
|
||||
|
||||
class IdentityInputFieldBuilder {
|
||||
|
||||
final BuildContext _context;
|
||||
final ResponsiveUtils _responsiveUtils;
|
||||
final String _label;
|
||||
final String? _error;
|
||||
final TextEditingController? editingController;
|
||||
@@ -19,8 +17,6 @@ class IdentityInputFieldBuilder {
|
||||
OnChangeInputNameAction? onChangeInputNameAction;
|
||||
|
||||
IdentityInputFieldBuilder(
|
||||
this._context,
|
||||
this._responsiveUtils,
|
||||
this._label,
|
||||
this._error, {
|
||||
this.isMandatory = false,
|
||||
@@ -48,8 +44,8 @@ class IdentityInputFieldBuilder {
|
||||
..textStyle(const TextStyle(color: Colors.black, fontSize: 16))
|
||||
..keyboardType(inputType ?? TextInputType.text)
|
||||
..textDecoration((IdentityInputDecorationBuilder()
|
||||
..setContentPadding(EdgeInsets.symmetric(
|
||||
vertical: _responsiveUtils.isDesktop(_context) ? 16 : 12,
|
||||
..setContentPadding(const EdgeInsets.symmetric(
|
||||
vertical: BuildUtils.isWeb ? 16 : 12,
|
||||
horizontal: 12))
|
||||
..setErrorText(_error))
|
||||
.build()))
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
||||
|
||||
abstract class ManageAccountDataSource {
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId);
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties});
|
||||
|
||||
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest);
|
||||
|
||||
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId);
|
||||
|
||||
Future<Identity> editIdentity(AccountId accountId, EditIdentityRequest identityRequest);
|
||||
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest);
|
||||
}
|
||||
+5
-4
@@ -1,4 +1,5 @@
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart';
|
||||
@@ -13,9 +14,9 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
|
||||
ManageAccountDataSourceImpl(this.manageAccountAPI);
|
||||
|
||||
@override
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId) {
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}) {
|
||||
return Future.sync(() async {
|
||||
return await manageAccountAPI.getAllIdentities(accountId);
|
||||
return await manageAccountAPI.getAllIdentities(accountId, properties: properties);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
@@ -40,9 +41,9 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Identity> editIdentity(AccountId accountId, EditIdentityRequest identityRequest) {
|
||||
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) {
|
||||
return Future.sync(() async {
|
||||
return await manageAccountAPI.editIdentity(accountId, identityRequest);
|
||||
return await manageAccountAPI.editIdentity(accountId, editIdentityRequest);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:async';
|
||||
import 'package:jmap_dart_client/http/http_client.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/get/get_identity_method.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/get/get_identity_response.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
@@ -19,10 +20,13 @@ class ManageAccountAPI {
|
||||
|
||||
ManageAccountAPI(this._httpClient);
|
||||
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId) async {
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}) async {
|
||||
final processingInvocation = ProcessingInvocation();
|
||||
final jmapRequestBuilder = JmapRequestBuilder(_httpClient, processingInvocation);
|
||||
final getIdentityMethod = GetIdentityMethod(accountId);
|
||||
if (properties != null) {
|
||||
getIdentityMethod.addProperties(properties);
|
||||
}
|
||||
final queryInvocation = jmapRequestBuilder.invocation(getIdentityMethod);
|
||||
|
||||
final result = await (jmapRequestBuilder
|
||||
@@ -85,10 +89,10 @@ class ManageAccountAPI {
|
||||
});
|
||||
}
|
||||
|
||||
Future<Identity> editIdentity(AccountId accountId, EditIdentityRequest identityRequest) async {
|
||||
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) async {
|
||||
final setIdentityMethod = SetIdentityMethod(accountId)
|
||||
..addUpdates({
|
||||
identityRequest.identityId.id : PatchObject({})
|
||||
editIdentityRequest.identityId.id : PatchObject(editIdentityRequest.identityRequest.toJson())
|
||||
});
|
||||
|
||||
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
||||
@@ -105,7 +109,7 @@ class ManageAccountAPI {
|
||||
SetIdentityResponse.deserialize);
|
||||
|
||||
return Future.sync(() async {
|
||||
return setIdentityResponse!.updated![identityRequest.identityId]!;
|
||||
return setIdentityResponse?.updated?.containsKey(editIdentityRequest.identityId.id) == true;
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||
@@ -13,8 +14,8 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
|
||||
ManageAccountRepositoryImpl(this.dataSource);
|
||||
|
||||
@override
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId) {
|
||||
return dataSource.getAllIdentities(accountId);
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties}) {
|
||||
return dataSource.getAllIdentities(accountId, properties: properties);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -28,7 +29,7 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Identity> editIdentity(AccountId accountId, EditIdentityRequest identityRequest) {
|
||||
return dataSource.editIdentity(accountId, identityRequest);
|
||||
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest) {
|
||||
return dataSource.editIdentity(accountId, editIdentityRequest);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,15 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:model/model.dart';
|
||||
|
||||
class EditIdentityRequest with EquatableMixin {
|
||||
|
||||
final Identity newIdentity;
|
||||
final IdentityRequestDto identityRequest;
|
||||
final IdentityId identityId;
|
||||
|
||||
EditIdentityRequest(this.identityId, this.newIdentity);
|
||||
EditIdentityRequest({required this.identityId, required this.identityRequest});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [identityId, newIdentity];
|
||||
List<Object?> get props => [identityId, identityRequest];
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
|
||||
|
||||
abstract class ManageAccountRepository {
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId);
|
||||
Future<IdentitiesResponse> getAllIdentities(AccountId accountId, {Properties? properties});
|
||||
|
||||
Future<Identity> createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest);
|
||||
|
||||
Future<bool> deleteIdentity(AccountId accountId, IdentityId identityId);
|
||||
|
||||
Future<Identity> editIdentity(AccountId accountId, EditIdentityRequest identityRequest);
|
||||
Future<bool> editIdentity(AccountId accountId, EditIdentityRequest editIdentityRequest);
|
||||
}
|
||||
@@ -1,14 +1,11 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
|
||||
class EditIdentitySuccess extends UIState {
|
||||
|
||||
final Identity newIdentity;
|
||||
|
||||
EditIdentitySuccess(this.newIdentity);
|
||||
EditIdentitySuccess();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [newIdentity];
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class EditIdentityFailure extends FeatureFailure {
|
||||
|
||||
@@ -12,10 +12,13 @@ class EditIdentityInteractor {
|
||||
|
||||
EditIdentityInteractor(this.manageAccountRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(AccountId accountId, EditIdentityRequest identityRequest) async* {
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
AccountId accountId,
|
||||
EditIdentityRequest editIdentityRequest
|
||||
) async* {
|
||||
try {
|
||||
final newIdentity = await manageAccountRepository.editIdentity(accountId, identityRequest);
|
||||
yield Right(EditIdentitySuccess(newIdentity));
|
||||
final result = await manageAccountRepository.editIdentity(accountId, editIdentityRequest);
|
||||
yield result ? Right(EditIdentitySuccess()) : Left(EditIdentityFailure(null));
|
||||
} catch (exception) {
|
||||
yield Left(EditIdentityFailure(exception));
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:core';
|
||||
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/properties/properties.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||
|
||||
@@ -11,10 +12,10 @@ class GetAllIdentitiesInteractor {
|
||||
|
||||
GetAllIdentitiesInteractor(this.manageAccountRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(AccountId accountId) async* {
|
||||
Stream<Either<Failure, Success>> execute(AccountId accountId, {Properties? properties}) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(LoadingState());
|
||||
final identitiesResponse = await manageAccountRepository.getAllIdentities(accountId);
|
||||
final identitiesResponse = await manageAccountRepository.getAllIdentities(accountId, properties: properties);
|
||||
yield Right(GetAllIdentitiesSuccess(identitiesResponse.identities, identitiesResponse.state));
|
||||
} catch (exception) {
|
||||
yield Left(GetAllIdentitiesFailure(exception));
|
||||
|
||||
+13
-5
@@ -1,12 +1,13 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:model/extensions/identity_extension.dart';
|
||||
import 'package:model/extensions/list_identities_extension.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart';
|
||||
@@ -296,16 +297,23 @@ class IdentitiesController extends BaseController {
|
||||
identity: identity,
|
||||
actionType: IdentityActionType.edit));
|
||||
|
||||
log('IdentitiesController::goToEditIdentity(): $newIdentity');
|
||||
_editIdentityAction(accountId, newIdentity);
|
||||
if (newIdentity is Identity) {
|
||||
log('IdentitiesController::goToEditIdentity(): $newIdentity');
|
||||
_editIdentityAction(accountId, EditIdentityRequest(
|
||||
identityId: identity.id!,
|
||||
identityRequest: newIdentity.toIdentityRequest()
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _editIdentityAction(AccountId accountId, EditIdentityRequest identityRequest) async {
|
||||
consumeState(_editIdentityInteractor.execute(accountId, identityRequest));
|
||||
void _editIdentityAction(AccountId accountId, EditIdentityRequest editIdentityRequest) async {
|
||||
log('IdentitiesController::_editIdentityAction(): $editIdentityRequest');
|
||||
consumeState(_editIdentityInteractor.execute(accountId, editIdentityRequest));
|
||||
}
|
||||
|
||||
void _editIdentitySuccess(EditIdentitySuccess success) {
|
||||
log('IdentitiesController::_editIdentitySuccess(): $success');
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
_appToast.showToastWithIcon(
|
||||
currentOverlayContext!,
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:model/identity/identity_request_dto.dart';
|
||||
|
||||
extension IdentityExtension on Identity {
|
||||
EmailAddress toEmailAddressNoName() => EmailAddress(null, email);
|
||||
|
||||
IdentityRequestDto toIdentityRequest() => IdentityRequestDto(
|
||||
name: name,
|
||||
replyTo: replyTo,
|
||||
bcc: bcc,
|
||||
textSignature: textSignature,
|
||||
htmlSignature: htmlSignature);
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/http/converter/identities/identity_id_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/identities/signature_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'identity_request_dto.g.dart';
|
||||
|
||||
@IdentityIdNullableConverter()
|
||||
@SignatureNullableConverter()
|
||||
@JsonSerializable()
|
||||
class IdentityRequestDto with EquatableMixin {
|
||||
|
||||
@JsonKey(includeIfNull: false)
|
||||
final String? name;
|
||||
|
||||
@JsonKey(includeIfNull: false)
|
||||
final Set<EmailAddress>? bcc;
|
||||
|
||||
@JsonKey(includeIfNull: false)
|
||||
final Set<EmailAddress>? replyTo;
|
||||
|
||||
@JsonKey(includeIfNull: false)
|
||||
final Signature? textSignature;
|
||||
|
||||
@JsonKey(includeIfNull: false)
|
||||
final Signature? htmlSignature;
|
||||
|
||||
IdentityRequestDto({
|
||||
this.name,
|
||||
this.bcc,
|
||||
this.replyTo,
|
||||
this.textSignature,
|
||||
this.htmlSignature,
|
||||
});
|
||||
|
||||
factory IdentityRequestDto.fromJson(Map<String, dynamic> json) => _$IdentityRequestDtoFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$IdentityRequestDtoToJson(this);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
name,
|
||||
bcc,
|
||||
replyTo,
|
||||
textSignature,
|
||||
htmlSignature,
|
||||
];
|
||||
}
|
||||
@@ -56,6 +56,7 @@ export 'extensions/list_attachment_extension.dart';
|
||||
export 'extensions/list_presentation_email_extension.dart';
|
||||
export 'extensions/list_email_content_extension.dart';
|
||||
export 'extensions/list_identities_extension.dart';
|
||||
export 'extensions/identity_extension.dart';
|
||||
|
||||
// Download
|
||||
export 'download/download_task_id.dart';
|
||||
@@ -70,4 +71,7 @@ export 'upload/upload_request.dart';
|
||||
export 'upload/upload_response.dart';
|
||||
|
||||
// AutoComplete
|
||||
export 'autocomplete/auto_complete_pattern.dart';
|
||||
export 'autocomplete/auto_complete_pattern.dart';
|
||||
|
||||
// Identity
|
||||
export 'identity/identity_request_dto.dart';
|
||||
Reference in New Issue
Block a user