diff --git a/assets/images/ic_bad_signature.svg b/assets/images/ic_bad_signature.svg new file mode 100644 index 000000000..32c50a0a4 --- /dev/null +++ b/assets/images/ic_bad_signature.svg @@ -0,0 +1,5 @@ + + + diff --git a/assets/images/ic_good_signature.svg b/assets/images/ic_good_signature.svg new file mode 100644 index 000000000..d08c8771f --- /dev/null +++ b/assets/images/ic_good_signature.svg @@ -0,0 +1,5 @@ + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 31228104a..eca728238 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -216,6 +216,8 @@ class ImagePaths { String get icRemoveRule => _getImagePath('ic_remove_rule.svg'); String get icCheckboxUnselected => _getImagePath('ic_checkbox_unselected.svg'); String get icCheckboxSelected => _getImagePath('ic_checkbox_selected.svg'); + String get icGoodSignature => _getImagePath('ic_good_signature.svg'); + String get icBadSignature => _getImagePath('ic_bad_signature.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/lib/features/email/presentation/model/smime_signature_status.dart b/lib/features/email/presentation/model/smime_signature_status.dart index 2f70565a1..141e7329f 100644 --- a/lib/features/email/presentation/model/smime_signature_status.dart +++ b/lib/features/email/presentation/model/smime_signature_status.dart @@ -1,5 +1,32 @@ + +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + enum SMimeSignatureStatus { goodSignature, badSignature, - notSigned + notSigned; + + String getIcon(ImagePaths imagePaths) { + switch(this) { + case SMimeSignatureStatus.goodSignature: + return imagePaths.icGoodSignature; + case SMimeSignatureStatus.badSignature: + return imagePaths.icBadSignature; + case SMimeSignatureStatus.notSigned: + return ''; + } + } + + String getTooltipMessage(BuildContext context) { + switch(this) { + case SMimeSignatureStatus.goodSignature: + return AppLocalizations.of(context).sMimeGoodSignatureMessage; + case SMimeSignatureStatus.badSignature: + return AppLocalizations.of(context).sMimeBadSignatureMessage; + case SMimeSignatureStatus.notSigned: + return ''; + } + } } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart b/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart index d28f0d1db..c9f164bfa 100644 --- a/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart +++ b/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart @@ -3,11 +3,14 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.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/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/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_sender_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_app_bar_widget.dart'; @@ -61,6 +64,17 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget { openEmailAddressDetailAction: openEmailAddressDetailAction, ) )), + if (emailSelected.sMimeStatus != SMimeSignatureStatus.notSigned) + Tooltip( + message: emailSelected.sMimeStatus.getTooltipMessage(context), + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: SvgPicture.asset( + emailSelected.sMimeStatus.getIcon(imagePaths), + fit: BoxFit.fill, + ), + ), + ), if (!emailSelected.isSubscribed && emailUnsubscribe != null && !responsiveUtils.isPortraitMobile(context)) TMailButtonWidget.fromText( text: AppLocalizations.of(context).unsubscribe, diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 870f8bed6..ddb80ff94 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-07-17T01:36:03.095458", + "@@last_modified": "2024-08-05T16:49:32.139855", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3963,5 +3963,17 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "sMimeGoodSignatureMessage": "The authenticity of this message had been verified with SMime signature.", + "@sMimeGoodSignatureMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "sMimeBadSignatureMessage": "This message failed SMime signature verification.", + "@sMimeBadSignatureMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 86a25edd8..0538c1253 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -4148,4 +4148,18 @@ class AppLocalizations { name: 'dialogMessageSessionHasExpired', ); } + + String get sMimeGoodSignatureMessage { + return Intl.message( + 'The authenticity of this message had been verified with SMime signature.', + name: 'sMimeGoodSignatureMessage', + ); + } + + String get sMimeBadSignatureMessage { + return Intl.message( + 'This message failed SMime signature verification.', + name: 'sMimeBadSignatureMessage', + ); + } } \ No newline at end of file