TF-536 Add presentation layer for edit identity
This commit is contained in:
@@ -14,6 +14,7 @@ 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/presentation/model/identity_action_type.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
|
||||
class IdentityCreatorController extends BaseController {
|
||||
@@ -36,6 +37,8 @@ class IdentityCreatorController extends BaseController {
|
||||
|
||||
AccountId? accountId;
|
||||
UserProfile? userProfile;
|
||||
IdentityActionType? actionType;
|
||||
Identity? identity;
|
||||
String? _nameIdentity;
|
||||
String? _contentHtmlEditor;
|
||||
|
||||
@@ -53,7 +56,11 @@ class IdentityCreatorController extends BaseController {
|
||||
@override
|
||||
void onReady() {
|
||||
_getArguments();
|
||||
_setDefaultValueForIdentity();
|
||||
if (actionType == IdentityActionType.edit && identity != null) {
|
||||
_setUpValueFromIdentity();
|
||||
} else {
|
||||
_setDefaultValueForIdentity();
|
||||
}
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
@@ -77,6 +84,8 @@ class IdentityCreatorController extends BaseController {
|
||||
if (arguments is IdentityCreatorArguments) {
|
||||
accountId = arguments.accountId;
|
||||
userProfile = arguments.userProfile;
|
||||
actionType = arguments.actionType;
|
||||
identity = arguments.identity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,13 +95,54 @@ class IdentityCreatorController extends BaseController {
|
||||
replyToOfIdentity.value = noneEmailAddress;
|
||||
|
||||
if (userProfile != null && userProfile?.email.isNotEmpty == true) {
|
||||
final userEmailAddress = EmailAddress(userProfile!.email, userProfile!.email);
|
||||
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 ?? '';
|
||||
}
|
||||
|
||||
if (identity?.htmlSignature?.value.isNotEmpty == true) {
|
||||
updateContentHtmlEditor(identity?.htmlSignature?.value ?? '');
|
||||
signatureHtmlEditorController.setText(identity?.htmlSignature?.value ?? '');
|
||||
}
|
||||
}
|
||||
|
||||
void selectSignatureType(SignatureType newSignatureType) {
|
||||
signatureType.value = newSignatureType;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import 'package:tmail_ui_user/features/identity_creator/presentation/identity_cr
|
||||
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_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';
|
||||
|
||||
class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
@@ -24,9 +25,16 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
backgroundColor: Colors.white,
|
||||
body: SafeArea(
|
||||
child: ClipRRect(
|
||||
borderRadius: _responsiveUtils.isMobile(context) && _responsiveUtils.isPortrait(context)
|
||||
? const BorderRadius.only(topRight: Radius.circular(14), topLeft: Radius.circular(14))
|
||||
: const BorderRadius.all(Radius.zero),
|
||||
borderRadius: const BorderRadius.only(topRight: Radius.circular(14), topLeft: Radius.circular(14)),
|
||||
child: _buildBodyMobile(context)
|
||||
),
|
||||
)
|
||||
),
|
||||
landscapeMobile: Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
body: SafeArea(
|
||||
child: ClipRRect(
|
||||
borderRadius: const BorderRadius.all(Radius.zero),
|
||||
child: _buildBodyMobile(context)
|
||||
),
|
||||
)
|
||||
@@ -418,29 +426,34 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
||||
)),
|
||||
const SizedBox(height: 24),
|
||||
Container(
|
||||
alignment: Alignment.centerRight,
|
||||
alignment: Alignment.center,
|
||||
color: Colors.white,
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
buildTextButton(
|
||||
AppLocalizations.of(context).cancel,
|
||||
textStyle: const TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 17,
|
||||
color: AppColor.colorTextButton),
|
||||
backgroundColor: AppColor.emailAddressChipColor,
|
||||
width: 128,
|
||||
height: 44,
|
||||
radius: 10,
|
||||
onTap: () => controller.closeView(context)),
|
||||
Expanded(
|
||||
child: buildTextButton(
|
||||
AppLocalizations.of(context).cancel,
|
||||
textStyle: const TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 17,
|
||||
color: AppColor.colorTextButton),
|
||||
backgroundColor: AppColor.emailAddressChipColor,
|
||||
width: 128,
|
||||
height: 44,
|
||||
radius: 10,
|
||||
onTap: () => controller.closeView(context)),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
buildTextButton(
|
||||
AppLocalizations.of(context).create,
|
||||
width: 128,
|
||||
height: 44,
|
||||
radius: 10,
|
||||
onTap: () => controller.createNewIdentity(context)),
|
||||
Expanded(
|
||||
child: Obx(() => buildTextButton(
|
||||
controller.actionType == IdentityActionType.create
|
||||
? AppLocalizations.of(context).create
|
||||
: AppLocalizations.of(context).save,
|
||||
width: 128,
|
||||
height: 44,
|
||||
radius: 10,
|
||||
onTap: () => controller.createNewIdentity(context))),
|
||||
),
|
||||
]
|
||||
),
|
||||
)
|
||||
|
||||
@@ -1,14 +1,25 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||
|
||||
class IdentityCreatorArguments with EquatableMixin {
|
||||
final AccountId accountId;
|
||||
final UserProfile userProfile;
|
||||
final IdentityActionType actionType;
|
||||
final Identity? identity;
|
||||
|
||||
IdentityCreatorArguments(this.accountId, this.userProfile);
|
||||
IdentityCreatorArguments(
|
||||
this.accountId,
|
||||
this.userProfile,
|
||||
{
|
||||
this.identity,
|
||||
this.actionType = IdentityActionType.create
|
||||
}
|
||||
);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [accountId, userProfile];
|
||||
List<Object?> get props => [accountId, userProfile, identity, actionType];
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
enum IdentityActionType {
|
||||
create,
|
||||
edit
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/manage_account/data/repository/manage_acc
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_identity_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.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/profiles/identities/identities_controller.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
@@ -28,6 +29,7 @@ class IdentitiesBindings extends BaseBindings {
|
||||
Get.find<DeleteIdentityInteractor>(),
|
||||
Get.find<CreateNewIdentityInteractor>(),
|
||||
Get.find<Uuid>(),
|
||||
Get.find<EditIdentityInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
@@ -46,6 +48,7 @@ class IdentitiesBindings extends BaseBindings {
|
||||
Get.lazyPut(() => GetAllIdentitiesInteractor(Get.find<ManageAccountRepository>()));
|
||||
Get.lazyPut(() => CreateNewIdentityInteractor(Get.find<ManageAccountRepository>()));
|
||||
Get.lazyPut(() => DeleteIdentityInteractor(Get.find<ManageAccountRepository>()));
|
||||
Get.lazyPut(() => EditIdentityInteractor(Get.find<ManageAccountRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
+42
@@ -10,13 +10,17 @@ import 'package:jmap_dart_client/jmap/identities/identity.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';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_identity_state.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.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/create_new_identity_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_identity_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.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/manage_account_dashboard_controller.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';
|
||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
@@ -33,6 +37,7 @@ class IdentitiesController extends BaseController {
|
||||
final CreateNewIdentityInteractor _createNewIdentityInteractor;
|
||||
final Uuid _uuid;
|
||||
final DeleteIdentityInteractor _deleteIdentityInteractor;
|
||||
final EditIdentityInteractor _editIdentityInteractor;
|
||||
|
||||
final identitySelected = Rxn<Identity>();
|
||||
final listAllIdentities = <Identity>[].obs;
|
||||
@@ -45,6 +50,7 @@ class IdentitiesController extends BaseController {
|
||||
this._deleteIdentityInteractor,
|
||||
this._createNewIdentityInteractor,
|
||||
this._uuid,
|
||||
this._editIdentityInteractor,
|
||||
);
|
||||
|
||||
@override
|
||||
@@ -74,6 +80,8 @@ class IdentitiesController extends BaseController {
|
||||
_createNewIdentitySuccess(success);
|
||||
} else if (success is DeleteIdentitySuccess) {
|
||||
_deleteIdentitySuccess(success);
|
||||
} else if (success is EditIdentitySuccess) {
|
||||
_editIdentitySuccess(success);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -262,4 +270,38 @@ class IdentitiesController extends BaseController {
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
void goToEditIdentity(Identity identity) async {
|
||||
popBack();
|
||||
|
||||
final accountId = _accountDashBoardController.accountId.value;
|
||||
final userProfile = _accountDashBoardController.userProfile.value;
|
||||
if (accountId != null && userProfile != null) {
|
||||
final newIdentity = await push(
|
||||
AppRoutes.IDENTITY_CREATOR,
|
||||
arguments: IdentityCreatorArguments(
|
||||
accountId,
|
||||
userProfile,
|
||||
identity: identity,
|
||||
actionType: IdentityActionType.edit));
|
||||
|
||||
log('IdentitiesController::goToEditIdentity(): $newIdentity');
|
||||
_editIdentityAction(accountId, newIdentity);
|
||||
}
|
||||
}
|
||||
|
||||
void _editIdentityAction(AccountId accountId, EditIdentityRequest identityRequest) async {
|
||||
consumeState(_editIdentityInteractor.execute(accountId, identityRequest));
|
||||
}
|
||||
|
||||
void _editIdentitySuccess(EditIdentitySuccess success) {
|
||||
if (currentOverlayContext != null && currentContext != null) {
|
||||
_appToast.showToastWithIcon(
|
||||
currentOverlayContext!,
|
||||
message: AppLocalizations.of(currentContext!).you_are_changed_your_identity_successfully,
|
||||
icon: _imagePaths.icSelected);
|
||||
}
|
||||
|
||||
_refreshAllIdentities();
|
||||
}
|
||||
}
|
||||
@@ -170,6 +170,15 @@ class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidge
|
||||
|
||||
List<PopupMenuEntry> _popupMenuIdentityActionTiles(BuildContext context, Identity identity) {
|
||||
return [
|
||||
PopupMenuItem(
|
||||
padding: EdgeInsets.zero,
|
||||
child: popupItem(_imagePaths.icEdit,
|
||||
AppLocalizations.of(context).edit_identity,
|
||||
styleName: const TextStyle(
|
||||
fontWeight: FontWeight.normal,
|
||||
fontSize: 17,
|
||||
color: Colors.black),
|
||||
onCallbackAction: () => controller.goToEditIdentity(identity))),
|
||||
if (identity.mayDelete == true)
|
||||
PopupMenuItem(
|
||||
padding: EdgeInsets.zero,
|
||||
@@ -186,6 +195,7 @@ class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidge
|
||||
|
||||
List<Widget> _bottomSheetIdentityActionTiles(BuildContext context, Identity identity) {
|
||||
return <Widget>[
|
||||
_editIdentityActionTile(context, identity),
|
||||
if (identity.mayDelete == true)
|
||||
_deleteIdentityActionTile(context, identity),
|
||||
];
|
||||
@@ -207,4 +217,20 @@ class IdentitiesView extends GetWidget<IdentitiesController> with PopupMenuWidge
|
||||
..onActionClick((identity) => controller.openConfirmationDialogDeleteIdentityAction(context, identity)))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _editIdentityActionTile(BuildContext context, Identity identity) {
|
||||
return (IdentityBottomSheetActionTileBuilder(
|
||||
const Key('edit_identity_action'),
|
||||
SvgPicture.asset(_imagePaths.icEdit),
|
||||
AppLocalizations.of(context).edit_identity,
|
||||
identity,
|
||||
iconLeftPadding: _responsiveUtils.isMobile(context)
|
||||
? const EdgeInsets.only(left: 12, right: 16)
|
||||
: const EdgeInsets.only(right: 12),
|
||||
iconRightPadding: _responsiveUtils.isMobile(context)
|
||||
? const EdgeInsets.only(right: 12)
|
||||
: EdgeInsets.zero)
|
||||
..onActionClick((identity) => controller.goToEditIdentity(identity)))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
+19
-13
@@ -42,22 +42,28 @@ class IdentityInfoTileBuilder extends StatelessWidget {
|
||||
padding: const EdgeInsets.only(left: 12, right: 8),
|
||||
child: Row(children: [
|
||||
if (_identity?.mayDelete == false)
|
||||
Expanded(child: Row(children: [
|
||||
Text(_identity?.name ?? '',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 17,
|
||||
color: Colors.black)),
|
||||
const SizedBox(width: 10),
|
||||
Expanded(child: Text(
|
||||
'(${AppLocalizations.of(context).default_value})',
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.normal,
|
||||
fontSize: 15,
|
||||
color: AppColor.colorHintSearchBar)))
|
||||
Expanded(child: Wrap(children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 10),
|
||||
child: Text(_identity?.name ?? '',
|
||||
maxLines: 1,
|
||||
overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 17,
|
||||
color: Colors.black))),
|
||||
Text('(${AppLocalizations.of(context).default_value})',
|
||||
maxLines: 1,
|
||||
overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.normal,
|
||||
fontSize: 15,
|
||||
color: AppColor.colorHintSearchBar))
|
||||
]))
|
||||
else
|
||||
Expanded(child: Text(_identity?.name ?? '',
|
||||
maxLines: 1,
|
||||
overflow: BuildUtils.isWeb ? null : TextOverflow.ellipsis,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 17,
|
||||
|
||||
Reference in New Issue
Block a user