diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart index a66e1265c..bcb8bde70 100644 --- a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart +++ b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart @@ -120,16 +120,16 @@ class _HtmlContentViewerOnWebState extends State { let textContent = e.target.textContent; console.log("handleOnClickLink: " + link); console.log("handleOnClickLink: " + textContent); - if (link && isValidUrl(link)) { + if (link && isValidMailtoLink(link)) { window.parent.postMessage(JSON.stringify({"view": "$createdViewId", "type": "toDart: OpenLink", "url": "" + link}), "*"); e.preventDefault(); - } else if (textContent && isValidUrl(textContent)) { + } else if (textContent && isValidMailtoLink(textContent)) { window.parent.postMessage(JSON.stringify({"view": "$createdViewId", "type": "toDart: OpenLink", "url": "" + textContent}), "*"); e.preventDefault(); } } - function isValidUrl(string) { + function isValidMailtoLink(string) { let url; try { @@ -138,7 +138,7 @@ class _HtmlContentViewerOnWebState extends State { return false; } - return url.protocol === "http:" || url.protocol === "https:" || url.protocol === "mailto:"; + return url.protocol === "mailto:"; } '''; @@ -232,8 +232,6 @@ class _HtmlContentViewerOnWebState extends State { final urlString = link as String; if (urlString.startsWith('mailto:')) { widget.mailtoDelegate?.call(Uri.parse(urlString)); - } else { - html.window.open(urlString, '_blank'); } } } diff --git a/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart b/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart index 3b7a1ae73..57b2c1662 100644 --- a/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart +++ b/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart @@ -20,12 +20,15 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_id 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/state/transform_html_signature_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.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_default_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/domain/usecases/transform_html_signature_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.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/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart'; @@ -46,8 +49,10 @@ class IdentitiesController extends BaseController { final DeleteIdentityInteractor _deleteIdentityInteractor; final EditIdentityInteractor _editIdentityInteractor; final EditDefaultIdentityInteractor _editDefaultIdentityInteractor; + final TransformHtmlSignatureInteractor _transformHtmlSignatureInteractor; final identitySelected = Rxn(); + final signatureSelected = Rxn(); final listAllIdentities = [].obs; IdentitiesController( @@ -56,7 +61,8 @@ class IdentitiesController extends BaseController { this._createNewIdentityInteractor, this._editIdentityInteractor, this._createNewDefaultIdentityInteractor, - this._editDefaultIdentityInteractor + this._editDefaultIdentityInteractor, + this._transformHtmlSignatureInteractor ); @override @@ -84,6 +90,8 @@ class IdentitiesController extends BaseController { _deleteIdentitySuccess(success); } else if (success is EditIdentitySuccess) { _editIdentitySuccess(success); + } else if (success is TransformHtmlSignatureSuccess) { + signatureSelected.value = success.signature; } } ); @@ -127,7 +135,12 @@ class IdentitiesController extends BaseController { } void selectIdentity(Identity? newIdentity) { + signatureSelected.value = null; identitySelected.value = newIdentity; + + if (newIdentity != null) { + consumeState(_transformHtmlSignatureInteractor.execute(newIdentity.signatureAsString)); + } } void goToCreateNewIdentity(BuildContext context) async { diff --git a/lib/features/manage_account/presentation/profiles/identities/identity_bindings.dart b/lib/features/manage_account/presentation/profiles/identities/identity_bindings.dart index dde20f9c5..cf1f63c4c 100644 --- a/lib/features/manage_account/presentation/profiles/identities/identity_bindings.dart +++ b/lib/features/manage_account/presentation/profiles/identities/identity_bindings.dart @@ -5,6 +5,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_ide import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_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/domain/usecases/transform_html_signature_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart'; @@ -20,7 +21,8 @@ class IdentityBindings extends Bindings { Get.find(), Get.find(), Get.find(), - Get.find() + Get.find(), + Get.find() )); } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart b/lib/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart index 36586c760..d8a165822 100644 --- a/lib/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart +++ b/lib/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart @@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_ide import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_default_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/domain/usecases/transform_html_signature_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; @@ -52,6 +53,7 @@ class IdentityInteractorsBindings extends InteractorsBindings { Get.lazyPut(() => EditDefaultIdentityInteractor( Get.find(), Get.find())); + Get.lazyPut(() => TransformHtmlSignatureInteractor(Get.find())); } @override diff --git a/lib/features/manage_account/presentation/profiles/identities/widgets/identities_radio_list_builder.dart b/lib/features/manage_account/presentation/profiles/identities/widgets/identities_radio_list_builder.dart index 68466e51d..a1557c800 100644 --- a/lib/features/manage_account/presentation/profiles/identities/widgets/identities_radio_list_builder.dart +++ b/lib/features/manage_account/presentation/profiles/identities/widgets/identities_radio_list_builder.dart @@ -2,8 +2,10 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:fading_edge_scrollview/fading_edge_scrollview.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get_state_manager/get_state_manager.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/transform_html_signature_state.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identities_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/identity_list_tile_builder.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart'; @@ -46,7 +48,13 @@ class IdentitiesRadioListBuilder extends StatelessWidget { ...[ _buildListIdentityView(context), Container(height: 1, color: AppColor.attachmentFileBorderColor), - Obx(() => SignatureBuilder(identity: controller.identitySelected.value!)) + Obx(() { + if (controller.signatureSelected.value != null) { + return SignatureBuilder(controller.signatureSelected.value!); + } else { + return _buildLoadingView(); + } + }) ] else _buildListIdentityView(context) @@ -62,9 +70,13 @@ class IdentitiesRadioListBuilder extends StatelessWidget { ...[ _buildListIdentityView(context), Container(width: 1, color: AppColor.attachmentFileBorderColor), - Expanded( - child: Obx(() => SignatureBuilder(identity: controller.identitySelected.value!)), - ) + Expanded(child: Obx(() { + if (controller.signatureSelected.value != null) { + return SignatureBuilder(controller.signatureSelected.value!); + } else { + return _buildLoadingView(); + } + })) ] else Expanded(child: _buildListIdentityView(context)) @@ -102,4 +114,26 @@ class IdentitiesRadioListBuilder extends StatelessWidget { )) ); } + + Widget _buildLoadingView() { + return Obx(() => controller.viewState.value.fold( + (failure) => const SizedBox.shrink(), + (success) { + if (success is TransformHtmlSignatureLoading) { + return const Align( + alignment: Alignment.topCenter, + child: Padding( + padding: EdgeInsets.all(16), + child: SizedBox( + width: 30, + height: 30, + child: CupertinoActivityIndicator(color: AppColor.colorLoading) + )) + ); + } else { + return const SizedBox.shrink(); + } + } + )); + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart b/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart index a0d0fdafc..8f7a275ce 100644 --- a/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart +++ b/lib/features/manage_account/presentation/profiles/identities/widgets/signature_builder.dart @@ -1,23 +1,19 @@ import 'package:core/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart'; import 'package:core/presentation/views/html_viewer/html_content_viewer_widget.dart'; import 'package:core/presentation/views/html_viewer/html_viewer_controller_for_web.dart'; -import 'package:core/utils/app_logger.dart'; import 'package:core/utils/build_utils.dart'; import 'package:flutter/material.dart'; -import 'package:html_unescape/html_unescape_small.dart'; -import 'package:jmap_dart_client/jmap/identities/identity.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart'; class SignatureBuilder extends StatelessWidget { - const SignatureBuilder({ + const SignatureBuilder( + this.signatureSelected, { Key? key, - required this.identity, this.width, this.height = 256 }) : super(key: key); - final Identity identity; + final String signatureSelected; final double? width; final double height; @@ -38,13 +34,10 @@ class SignatureBuilder extends StatelessWidget { } Widget _buildSignature(double width, double height) { - final signature = identity.signatureAsString; - log('SignatureBuilder::_buildSignature():signature: $signature'); - if (signature.isNotEmpty) { - final htmlSignatureDecoded = _decodeHtml(signature); + if (signatureSelected.isNotEmpty) { if (BuildUtils.isWeb) { return HtmlContentViewerOnWeb( - contentHtml: htmlSignatureDecoded, + contentHtml: signatureSelected, widthContent: width, heightContent: height, controller: HtmlViewerControllerForWeb(), @@ -52,7 +45,7 @@ class SignatureBuilder extends StatelessWidget { ); } else { return HtmlContentViewer( - contentHtml: htmlSignatureDecoded, + contentHtml: signatureSelected, heightContent: height ); } @@ -60,9 +53,4 @@ class SignatureBuilder extends StatelessWidget { return SizedBox(width: width, height: height); } } - - String _decodeHtml(String htmlString) { - final unescape = HtmlUnescape(); - return unescape.convert(htmlString); - } } \ No newline at end of file