diff --git a/lib/features/manage_account/data/network/identity_api.dart b/lib/features/manage_account/data/network/identity_api.dart index 10fde3bdb..1d1610af9 100644 --- a/lib/features/manage_account/data/network/identity_api.dart +++ b/lib/features/manage_account/data/network/identity_api.dart @@ -2,12 +2,15 @@ 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/core/unsigned_int.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'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_method.dart'; import 'package:jmap_dart_client/jmap/identities/set/set_identity_response.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; +import 'package:model/identity/identity_request_dto.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_default_identity_request.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'; @@ -20,13 +23,19 @@ class IdentityAPI { Future getAllIdentities(AccountId accountId, {Properties? properties}) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final getIdentityMethod = GetIdentityMethod(accountId); + var capability = getIdentityMethod.requiredCapabilities; if (properties != null) { getIdentityMethod.addProperties(properties); + if(properties.value.contains('sortOrder')) { + capability = getIdentityMethod.requiredCapabilitiesSupportSortOrder; + } + } else { + capability = getIdentityMethod.requiredCapabilitiesSupportSortOrder; } final queryInvocation = requestBuilder.invocation(getIdentityMethod); final result = await (requestBuilder - ..usings(getIdentityMethod.requiredCapabilities)) + ..usings(capability)) .build() .execute(); @@ -40,13 +49,19 @@ class IdentityAPI { Future createNewIdentity(AccountId accountId, CreateNewIdentityRequest identityRequest) async { final setIdentityMethod = SetIdentityMethod(accountId) ..addCreate(identityRequest.creationId, identityRequest.newIdentity); + + var capabilities = setIdentityMethod.requiredCapabilities; + if (identityRequest is CreateNewDefaultIdentityRequest) { + capabilities = setIdentityMethod.requiredCapabilitiesSupportSortOrder; + _addUpdatesToCreateDefaultIdentityMethod(setIdentityMethod, identityRequest); + } final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final setIdentityInvocation = requestBuilder.invocation(setIdentityMethod); final response = await (requestBuilder - ..usings(setIdentityMethod.requiredCapabilities)) + ..usings(capabilities)) .build() .execute(); @@ -57,6 +72,17 @@ class IdentityAPI { return setIdentityResponse!.created![identityRequest.creationId]!; } + void _addUpdatesToCreateDefaultIdentityMethod( + SetIdentityMethod setIdentityMethod, + CreateNewDefaultIdentityRequest identityRequest + ) { + for (var i = 0; i < (identityRequest.oldDefaultIdentityIds?.length ?? 0); i++) { + setIdentityMethod.addUpdates({ + identityRequest.oldDefaultIdentityIds![i].id : PatchObject(IdentityRequestDto(sortOrder: UnsignedInt(100)).toJson()) + }); + } + } + Future deleteIdentity(AccountId accountId, IdentityId identityId) async { final setIdentityMethod = SetIdentityMethod(accountId) ..addDestroy({identityId.id}); diff --git a/lib/features/manage_account/domain/model/create_new_default_identity_request.dart b/lib/features/manage_account/domain/model/create_new_default_identity_request.dart new file mode 100644 index 000000000..52b32b724 --- /dev/null +++ b/lib/features/manage_account/domain/model/create_new_default_identity_request.dart @@ -0,0 +1,21 @@ + +import 'package:jmap_dart_client/jmap/identities/identity.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; + +class CreateNewDefaultIdentityRequest extends CreateNewIdentityRequest { + + final List? oldDefaultIdentityIds; + + CreateNewDefaultIdentityRequest( + super.creationId, + super.newIdentity, + { + this.oldDefaultIdentityIds + }); + + @override + List get props => [ + super.creationId, + super.newIdentity, + oldDefaultIdentityIds]; +} \ No newline at end of file diff --git a/lib/features/manage_account/domain/model/create_new_identity_request.dart b/lib/features/manage_account/domain/model/create_new_identity_request.dart index 34c32cb79..a765e229d 100644 --- a/lib/features/manage_account/domain/model/create_new_identity_request.dart +++ b/lib/features/manage_account/domain/model/create_new_identity_request.dart @@ -7,9 +7,15 @@ class CreateNewIdentityRequest with EquatableMixin { final Identity newIdentity; final Id creationId; + final bool isDefaultIdentity; - CreateNewIdentityRequest(this.creationId, this.newIdentity); + CreateNewIdentityRequest( + this.creationId, + this.newIdentity, + { + this.isDefaultIdentity = false + }); @override - List get props => [creationId, newIdentity]; + List get props => [creationId, newIdentity, isDefaultIdentity]; } \ No newline at end of file diff --git a/model/lib/identity/identity_request_dto.dart b/model/lib/identity/identity_request_dto.dart index 1e7d81bcd..c1cabcd75 100644 --- a/model/lib/identity/identity_request_dto.dart +++ b/model/lib/identity/identity_request_dto.dart @@ -2,6 +2,8 @@ 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/http/converter/unsigned_int_nullable_converter.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.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'; @@ -11,6 +13,7 @@ part 'identity_request_dto.g.dart'; @IdentityIdNullableConverter() @SignatureNullableConverter() @JsonSerializable() +@UnsignedIntNullableConverter() class IdentityRequestDto with EquatableMixin { final String? name; @@ -18,6 +21,7 @@ class IdentityRequestDto with EquatableMixin { final Set? replyTo; final Signature? textSignature; final Signature? htmlSignature; + final UnsignedInt? sortOrder; IdentityRequestDto({ this.name, @@ -25,6 +29,7 @@ class IdentityRequestDto with EquatableMixin { this.replyTo, this.textSignature, this.htmlSignature, + this.sortOrder }); factory IdentityRequestDto.fromJson(Map json) => _$IdentityRequestDtoFromJson(json); @@ -38,5 +43,6 @@ class IdentityRequestDto with EquatableMixin { replyTo, textSignature, htmlSignature, + sortOrder ]; } \ No newline at end of file