diff --git a/lib/features/manage_account/domain/state/edit_default_identity_state.dart b/lib/features/manage_account/domain/state/edit_default_identity_state.dart new file mode 100644 index 000000000..53537d6e3 --- /dev/null +++ b/lib/features/manage_account/domain/state/edit_default_identity_state.dart @@ -0,0 +1,21 @@ +import 'package:core/core.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart'; + +class EditDefaultIdentityLoading extends UIState {} + +class EditDefaultIdentitySuccess extends EditIdentitySuccess { + + EditDefaultIdentitySuccess(); + + @override + List get props => []; +} + +class EditDefaultIdentityFailure extends FeatureFailure { + final dynamic exception; + + EditDefaultIdentityFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart b/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart new file mode 100644 index 000000000..aea9fe7d7 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/edit_default_identity_interactor.dart @@ -0,0 +1,65 @@ +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:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/model/edit_default_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/repository/identity_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/edit_default_identity_state.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; + +class EditDefaultIdentityInteractor { + final IdentityRepository _identityRepository; + final IdentityUtils _identityUtils; + + EditDefaultIdentityInteractor( + this._identityRepository, + this._identityUtils + ); + + Stream> execute( + AccountId accountId, + EditIdentityRequest editIdentityRequest + ) async* { + try { + yield Right(EditDefaultIdentityLoading()); + + final defaultIdentities = await _getDefaultIdentities(accountId); + _removeEditIdentityFromDefaultIdentities(defaultIdentities, editIdentityRequest.identityId); + + final editDefaultRequest = EditDefaultIdentityRequest( + identityId: editIdentityRequest.identityId, + identityRequest: editIdentityRequest.identityRequest, + isDefaultIdentity: editIdentityRequest.isDefaultIdentity, + oldDefaultIdentityIds: defaultIdentities + ?.map((identity) => identity.id!) + .toList()); + + final result = await _identityRepository.editIdentity(accountId, editDefaultRequest); + yield result ? Right(EditDefaultIdentitySuccess()) : Left(EditDefaultIdentityFailure(null)); + } catch (exception) { + yield Left(EditDefaultIdentityFailure(exception)); + } + } + + Future?> _getDefaultIdentities(AccountId accountId) async { + final listIdentities = await _identityRepository + .getAllIdentities( + accountId, + properties: Properties({'sortOrder'}) + ); + return _identityUtils + .getSmallestOrderedIdentity(listIdentities.identities) + ?.toList(); + } + + void _removeEditIdentityFromDefaultIdentities( + List? defaultIdentities, + IdentityId editIdentityId + ) { + defaultIdentities?.removeWhere((identity) => identity.id == editIdentityId); + } +} \ No newline at end of file