TF-536 Add presentation layer for edit identity

This commit is contained in:
dab246
2022-05-06 15:13:37 +07:00
committed by Dat H. Pham
parent 15de506b97
commit 5cc5ff9761
12 changed files with 246 additions and 40 deletions
@@ -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
@@ -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();
}
}
@@ -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,