Fix SMime signature status not displayed

This commit is contained in:
dab246
2024-08-27 15:11:48 +07:00
committed by Dat H. Pham
parent 5375f20e23
commit 0c4076cab6
30 changed files with 64 additions and 43 deletions
+2 -2
View File
@@ -612,10 +612,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -15,8 +15,6 @@ dependencies:
path: ../model path: ../model
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
+2 -2
View File
@@ -296,10 +296,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -12,8 +12,6 @@ dependencies:
sdk: flutter sdk: flutter
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
+2 -2
View File
@@ -296,10 +296,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -12,8 +12,6 @@ dependencies:
sdk: flutter sdk: flutter
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
+2 -2
View File
@@ -296,10 +296,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -12,8 +12,6 @@ dependencies:
sdk: flutter sdk: flutter
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
@@ -5,6 +5,7 @@ import 'package:tmail_ui_user/features/email/domain/extensions/list_attachments_
import 'package:tmail_ui_user/features/email/domain/extensions/list_email_header_extension.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/list_email_header_extension.dart';
import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart';
import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart'; import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_cache.dart';
import 'package:tmail_ui_user/features/thread/data/extensions/map_header_identifier_id_extension.dart';
import 'package:tmail_ui_user/features/thread/data/extensions/map_keywords_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/map_keywords_extension.dart';
extension DetailedEmailExtension on DetailedEmail { extension DetailedEmailExtension on DetailedEmail {
@@ -19,6 +20,7 @@ extension DetailedEmailExtension on DetailedEmail {
messageId: messageId?.ids.toList(), messageId: messageId?.ids.toList(),
references: references?.ids.toList(), references: references?.ids.toList(),
inlineImages: inlineImages?.toHiveCache(), inlineImages: inlineImages?.toHiveCache(),
sMimeStatusHeader: sMimeStatusHeader?.toMapString(),
); );
} }
@@ -38,6 +40,7 @@ extension DetailedEmailExtension on DetailedEmail {
messageId: messageId, messageId: messageId,
references: references, references: references,
inlineImages: inlineImages, inlineImages: inlineImages,
sMimeStatusHeader: sMimeStatusHeader
); );
} }
} }
@@ -1,5 +1,6 @@
import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/individual_header_identifier.dart';
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/list_acttachments_hive_cache_extension.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/list_acttachments_hive_cache_extension.dart';
import 'package:tmail_ui_user/features/email/domain/extensions/list_email_header_hive_cache_extension.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/list_email_header_hive_cache_extension.dart';
@@ -24,6 +25,9 @@ extension DetailedEmailHiveCacheExtension on DetailedEmailHiveCache {
? MessageIdsHeaderValue(references!.toSet()) ? MessageIdsHeaderValue(references!.toSet())
: null, : null,
inlineImages: inlineImages?.toAttachment(), inlineImages: inlineImages?.toAttachment(),
sMimeStatusHeader: sMimeStatusHeader != null
? Map.fromIterables(sMimeStatusHeader!.keys.map((value) => IndividualHeaderIdentifier(value)), sMimeStatusHeader!.values)
: null,
); );
} }
} }
@@ -16,6 +16,7 @@ extension EmailExtension on Email {
messageId: messageId, messageId: messageId,
references: references, references: references,
inlineImages: allAttachments.listAttachmentsDisplayedInContent, inlineImages: allAttachments.listAttachmentsDisplayedInContent,
sMimeStatusHeader: sMimeStatusHeader,
); );
} }
} }
@@ -1,6 +1,7 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_header.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_header.dart';
import 'package:jmap_dart_client/jmap/mail/email/individual_header_identifier.dart';
import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart';
import 'package:model/email/attachment.dart'; import 'package:model/email/attachment.dart';
@@ -15,6 +16,7 @@ class DetailedEmail with EquatableMixin {
final MessageIdsHeaderValue? messageId; final MessageIdsHeaderValue? messageId;
final MessageIdsHeaderValue? references; final MessageIdsHeaderValue? references;
final List<Attachment>? inlineImages; final List<Attachment>? inlineImages;
final Map<IndividualHeaderIdentifier, String?>? sMimeStatusHeader;
DetailedEmail({ DetailedEmail({
required this.emailId, required this.emailId,
@@ -27,6 +29,7 @@ class DetailedEmail with EquatableMixin {
this.messageId, this.messageId,
this.references, this.references,
this.inlineImages, this.inlineImages,
this.sMimeStatusHeader,
}); });
@override @override
@@ -41,5 +44,6 @@ class DetailedEmail with EquatableMixin {
messageId, messageId,
references, references,
inlineImages, inlineImages,
sMimeStatusHeader,
]; ];
} }
@@ -98,7 +98,8 @@ class GetEmailContentInteractor {
emailCurrent: Email( emailCurrent: Email(
id: emailId, id: emailId,
headers: detailedEmail.headers, headers: detailedEmail.headers,
keywords: detailedEmail.keywords keywords: detailedEmail.keywords,
sMimeStatusHeader: detailedEmail.sMimeStatusHeader,
) )
)); ));
} catch (e) { } catch (e) {
@@ -130,7 +131,8 @@ class GetEmailContentInteractor {
emailCurrent: Email( emailCurrent: Email(
id: emailId, id: emailId,
headers: detailedEmail.headers, headers: detailedEmail.headers,
keywords: detailedEmail.keywords keywords: detailedEmail.keywords,
sMimeStatusHeader: detailedEmail.sMimeStatusHeader,
) )
)); ));
} catch (e) { } catch (e) {
@@ -580,6 +580,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
htmlEmailContent: success.htmlEmailContent, htmlEmailContent: success.htmlEmailContent,
messageId: success.emailCurrent?.messageId, messageId: success.emailCurrent?.messageId,
references: success.emailCurrent?.references, references: success.emailCurrent?.references,
sMimeStatusHeader: success.emailCurrent?.sMimeStatusHeader,
); );
_storeOpenedEmailAction( _storeOpenedEmailAction(
@@ -317,6 +317,7 @@ class EmailView extends GetWidget<SingleEmailController> {
emailSelected: presentationEmail, emailSelected: presentationEmail,
imagePaths: controller.imagePaths, imagePaths: controller.imagePaths,
responsiveUtils: controller.responsiveUtils, responsiveUtils: controller.responsiveUtils,
sMimeStatus: controller.currentEmailLoaded.value?.sMimeStatus,
emailUnsubscribe: controller.emailUnsubscribe.value, emailUnsubscribe: controller.emailUnsubscribe.value,
maxBodyHeight: maxBodyHeight, maxBodyHeight: maxBodyHeight,
openEmailAddressDetailAction: controller.openEmailAddressDialog, openEmailAddressDetailAction: controller.openEmailAddressDialog,
@@ -1,13 +1,18 @@
import 'package:model/email/presentation_email.dart'; import 'package:core/utils/app_logger.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/extensions/email_extension.dart';
import 'package:model/extensions/list_email_header_extension.dart'; import 'package:model/extensions/list_email_header_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/model/smime_signature_status.dart'; import 'package:tmail_ui_user/features/email/presentation/model/smime_signature_status.dart';
import 'package:tmail_ui_user/features/email/presentation/utils/smime_signature_constant.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/smime_signature_constant.dart';
extension PresentationEmailExtension on PresentationEmail { extension EmailExtension on Email {
SMimeSignatureStatus get sMimeStatus { SMimeSignatureStatus get sMimeStatus {
final status = emailHeader?.toSet().sMimeStatus; final status = sMimeStatusHeaderParsed.isNotEmpty
? sMimeStatusHeaderParsed
: headers?.toSet().sMimeStatus;
log('EmailExtension::sMimeStatus: $status');
if (status == SMimeSignatureConstant.GOOD_SIGNATURE) { if (status == SMimeSignatureConstant.GOOD_SIGNATURE) {
return SMimeSignatureStatus.goodSignature; return SMimeSignatureStatus.goodSignature;
} else if (status == SMimeSignatureConstant.BAD_SIGNATURE) { } else if (status == SMimeSignatureConstant.BAD_SIGNATURE) {
@@ -1,6 +1,8 @@
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/attachment.dart'; import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/email_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/model/smime_signature_status.dart';
class EmailLoaded with EquatableMixin { class EmailLoaded with EquatableMixin {
final String htmlContent; final String htmlContent;
@@ -15,6 +17,8 @@ class EmailLoaded with EquatableMixin {
this.emailCurrent, this.emailCurrent,
}); });
SMimeSignatureStatus? get sMimeStatus => emailCurrent?.sMimeStatus;
@override @override
List<Object?> get props => [ List<Object?> get props => [
htmlContent, htmlContent,
@@ -8,7 +8,6 @@ import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart'; import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart';
import 'package:tmail_ui_user/features/base/widget/email_avatar_builder.dart'; import 'package:tmail_ui_user/features/base/widget/email_avatar_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/extensions/presentation_email_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/model/email_unsubscribe.dart'; import 'package:tmail_ui_user/features/email/presentation/model/email_unsubscribe.dart';
import 'package:tmail_ui_user/features/email/presentation/model/smime_signature_status.dart'; import 'package:tmail_ui_user/features/email/presentation/model/smime_signature_status.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_receiver_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_receiver_widget.dart';
@@ -26,12 +25,14 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget {
final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction; final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction;
final OnEmailActionClick? onEmailActionClick; final OnEmailActionClick? onEmailActionClick;
final double? maxBodyHeight; final double? maxBodyHeight;
final SMimeSignatureStatus? sMimeStatus;
const InformationSenderAndReceiverBuilder({ const InformationSenderAndReceiverBuilder({
Key? key, Key? key,
required this.emailSelected, required this.emailSelected,
required this.responsiveUtils, required this.responsiveUtils,
required this.imagePaths, required this.imagePaths,
this.sMimeStatus,
this.emailUnsubscribe, this.emailUnsubscribe,
this.maxBodyHeight, this.maxBodyHeight,
this.openEmailAddressDetailAction, this.openEmailAddressDetailAction,
@@ -64,14 +65,14 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget {
openEmailAddressDetailAction: openEmailAddressDetailAction, openEmailAddressDetailAction: openEmailAddressDetailAction,
) )
)), )),
if (emailSelected.sMimeStatus != SMimeSignatureStatus.notSigned) if (sMimeStatus != null && sMimeStatus != SMimeSignatureStatus.notSigned)
Tooltip( Tooltip(
key: const Key('smime_signature_status_icon'), key: const Key('smime_signature_status_icon'),
message: emailSelected.sMimeStatus.getTooltipMessage(context), message: sMimeStatus!.getTooltipMessage(context),
child: MouseRegion( child: MouseRegion(
cursor: SystemMouseCursors.click, cursor: SystemMouseCursors.click,
child: SvgPicture.asset( child: SvgPicture.asset(
emailSelected.sMimeStatus.getIcon(imagePaths), sMimeStatus!.getIcon(imagePaths),
fit: BoxFit.fill, fit: BoxFit.fill,
), ),
), ),
@@ -38,6 +38,9 @@ class DetailedEmailHiveCache extends HiveObject with EquatableMixin {
@HiveField(8) @HiveField(8)
final List<AttachmentHiveCache>? inlineImages; final List<AttachmentHiveCache>? inlineImages;
@HiveField(9)
Map<String, String?>? sMimeStatusHeader;
DetailedEmailHiveCache({ DetailedEmailHiveCache({
required this.emailId, required this.emailId,
required this.timeSaved, required this.timeSaved,
@@ -48,6 +51,7 @@ class DetailedEmailHiveCache extends HiveObject with EquatableMixin {
this.messageId, this.messageId,
this.references, this.references,
this.inlineImages, this.inlineImages,
this.sMimeStatusHeader,
}); });
@override @override
@@ -61,5 +65,6 @@ class DetailedEmailHiveCache extends HiveObject with EquatableMixin {
messageId, messageId,
references, references,
inlineImages, inlineImages,
sMimeStatusHeader,
]; ];
} }
@@ -51,6 +51,7 @@ class ThreadConstants {
EmailProperty.mailboxIds, EmailProperty.mailboxIds,
EmailProperty.messageId, EmailProperty.messageId,
EmailProperty.references, EmailProperty.references,
IndividualHeaderIdentifier.sMimeStatusHeader.value,
}); });
static final propertiesGetDetailedEmail = Properties({ static final propertiesGetDetailedEmail = Properties({
@@ -72,7 +73,8 @@ class ThreadConstants {
EmailProperty.bodyValues, EmailProperty.bodyValues,
EmailProperty.htmlBody, EmailProperty.htmlBody,
EmailProperty.attachments, EmailProperty.attachments,
EmailProperty.headers EmailProperty.headers,
IndividualHeaderIdentifier.sMimeStatusHeader.value,
}); });
static final propertiesCalendarEvent = Properties({ static final propertiesCalendarEvent = Properties({
@@ -32,6 +32,8 @@ extension EmailExtension on Email {
bool get hasListUnsubscribe => listUnsubscribe.isNotEmpty; bool get hasListUnsubscribe => listUnsubscribe.isNotEmpty;
String get sMimeStatusHeaderParsed => sMimeStatusHeader?[IndividualHeaderIdentifier.sMimeStatusHeader]?.trim() ?? '';
bool hasReadReceipt(Map<MailboxId, PresentationMailbox> mapMailbox) { bool hasReadReceipt(Map<MailboxId, PresentationMailbox> mapMailbox) {
final mailboxCurrent = findMailboxContain(mapMailbox); final mailboxCurrent = findMailboxContain(mapMailbox);
return !hasMdnSent && return !hasMdnSent &&
@@ -2,6 +2,7 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_header.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_header.dart';
import 'package:model/email/email_property.dart'; import 'package:model/email/email_property.dart';
import 'package:core/utils/app_logger.dart' as logger;
extension ListEmailHeaderExtension on Set<EmailHeader>? { extension ListEmailHeaderExtension on Set<EmailHeader>? {
bool get readReceiptHasBeenRequested { bool get readReceiptHasBeenRequested {
@@ -20,6 +21,7 @@ extension ListEmailHeaderExtension on Set<EmailHeader>? {
String get sMimeStatus { String get sMimeStatus {
final sMimeStatus = this?.firstWhereOrNull((header) => header.name == EmailProperty.headerSMimeStatusKey); final sMimeStatus = this?.firstWhereOrNull((header) => header.name == EmailProperty.headerSMimeStatusKey);
return sMimeStatus?.value ?? ''; logger.log('ListEmailHeaderExtension::sMimeStatus: $sMimeStatus');
return sMimeStatus?.value.trim() ?? '';
} }
} }
+2 -2
View File
@@ -604,10 +604,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -30,8 +30,6 @@ dependencies:
path: ../core path: ../core
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
+2 -2
View File
@@ -1196,10 +1196,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -62,8 +62,6 @@ dependencies:
url: https://github.com/linagora/html-editor-enhanced.git url: https://github.com/linagora/html-editor-enhanced.git
ref: main ref: main
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
+2 -2
View File
@@ -296,10 +296,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -12,8 +12,6 @@ dependencies:
sdk: flutter sdk: flutter
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git
+2 -2
View File
@@ -288,10 +288,10 @@ packages:
description: description:
path: "." path: "."
ref: main ref: main
resolved-ref: b1b0d407e5082f9d7afc88ccec8d05bf39ec992f resolved-ref: "80bd3a9d6bea2cca9cf905edfdea8b8d5e8c5a8e"
url: "https://github.com/linagora/jmap-dart-client.git" url: "https://github.com/linagora/jmap-dart-client.git"
source: git source: git
version: "0.2.0" version: "0.2.1"
js: js:
dependency: transitive dependency: transitive
description: description:
-2
View File
@@ -11,8 +11,6 @@ dependencies:
sdk: flutter sdk: flutter
### Dependencies from git ### ### Dependencies from git ###
# TODO: We will change it when the PR in upstream repository will be merged
# https://github.com/linagora/jmap-dart-client/pull/87
jmap_dart_client: jmap_dart_client:
git: git:
url: https://github.com/linagora/jmap-dart-client.git url: https://github.com/linagora/jmap-dart-client.git