TF-1684 Implement handle transform html signature

(cherry picked from commit cc535a6cf418d27b59e121ae6cd3dc57c065ddf3)
This commit is contained in:
dab246
2023-04-03 16:31:25 +07:00
committed by Dat Vu
parent c716557200
commit 58816574f9
6 changed files with 67 additions and 30 deletions
@@ -120,16 +120,16 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
let textContent = e.target.textContent; let textContent = e.target.textContent;
console.log("handleOnClickLink: " + link); console.log("handleOnClickLink: " + link);
console.log("handleOnClickLink: " + textContent); console.log("handleOnClickLink: " + textContent);
if (link && isValidUrl(link)) { if (link && isValidMailtoLink(link)) {
window.parent.postMessage(JSON.stringify({"view": "$createdViewId", "type": "toDart: OpenLink", "url": "" + link}), "*"); window.parent.postMessage(JSON.stringify({"view": "$createdViewId", "type": "toDart: OpenLink", "url": "" + link}), "*");
e.preventDefault(); e.preventDefault();
} else if (textContent && isValidUrl(textContent)) { } else if (textContent && isValidMailtoLink(textContent)) {
window.parent.postMessage(JSON.stringify({"view": "$createdViewId", "type": "toDart: OpenLink", "url": "" + textContent}), "*"); window.parent.postMessage(JSON.stringify({"view": "$createdViewId", "type": "toDart: OpenLink", "url": "" + textContent}), "*");
e.preventDefault(); e.preventDefault();
} }
} }
function isValidUrl(string) { function isValidMailtoLink(string) {
let url; let url;
try { try {
@@ -138,7 +138,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
return false; return false;
} }
return url.protocol === "http:" || url.protocol === "https:" || url.protocol === "mailto:"; return url.protocol === "mailto:";
} }
</script> </script>
'''; ''';
@@ -232,8 +232,6 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
final urlString = link as String; final urlString = link as String;
if (urlString.startsWith('mailto:')) { if (urlString.startsWith('mailto:')) {
widget.mailtoDelegate?.call(Uri.parse(urlString)); widget.mailtoDelegate?.call(Uri.parse(urlString));
} else {
html.window.open(urlString, '_blank');
} }
} }
} }
@@ -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/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/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/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_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/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/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_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/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/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/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/model/identity_action_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.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 DeleteIdentityInteractor _deleteIdentityInteractor;
final EditIdentityInteractor _editIdentityInteractor; final EditIdentityInteractor _editIdentityInteractor;
final EditDefaultIdentityInteractor _editDefaultIdentityInteractor; final EditDefaultIdentityInteractor _editDefaultIdentityInteractor;
final TransformHtmlSignatureInteractor _transformHtmlSignatureInteractor;
final identitySelected = Rxn<Identity>(); final identitySelected = Rxn<Identity>();
final signatureSelected = Rxn<String>();
final listAllIdentities = <Identity>[].obs; final listAllIdentities = <Identity>[].obs;
IdentitiesController( IdentitiesController(
@@ -56,7 +61,8 @@ class IdentitiesController extends BaseController {
this._createNewIdentityInteractor, this._createNewIdentityInteractor,
this._editIdentityInteractor, this._editIdentityInteractor,
this._createNewDefaultIdentityInteractor, this._createNewDefaultIdentityInteractor,
this._editDefaultIdentityInteractor this._editDefaultIdentityInteractor,
this._transformHtmlSignatureInteractor
); );
@override @override
@@ -84,6 +90,8 @@ class IdentitiesController extends BaseController {
_deleteIdentitySuccess(success); _deleteIdentitySuccess(success);
} else if (success is EditIdentitySuccess) { } else if (success is EditIdentitySuccess) {
_editIdentitySuccess(success); _editIdentitySuccess(success);
} else if (success is TransformHtmlSignatureSuccess) {
signatureSelected.value = success.signature;
} }
} }
); );
@@ -127,7 +135,12 @@ class IdentitiesController extends BaseController {
} }
void selectIdentity(Identity? newIdentity) { void selectIdentity(Identity? newIdentity) {
signatureSelected.value = null;
identitySelected.value = newIdentity; identitySelected.value = newIdentity;
if (newIdentity != null) {
consumeState(_transformHtmlSignatureInteractor.execute(newIdentity.signatureAsString));
}
} }
void goToCreateNewIdentity(BuildContext context) async { void goToCreateNewIdentity(BuildContext context) async {
@@ -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_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/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/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/identities_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.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<CreateNewIdentityInteractor>(), Get.find<CreateNewIdentityInteractor>(),
Get.find<EditIdentityInteractor>(), Get.find<EditIdentityInteractor>(),
Get.find<CreateNewDefaultIdentityInteractor>(), Get.find<CreateNewDefaultIdentityInteractor>(),
Get.find<EditDefaultIdentityInteractor>() Get.find<EditDefaultIdentityInteractor>(),
Get.find<TransformHtmlSignatureInteractor>()
)); ));
} }
} }
@@ -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_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/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/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/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
@@ -52,6 +53,7 @@ class IdentityInteractorsBindings extends InteractorsBindings {
Get.lazyPut(() => EditDefaultIdentityInteractor( Get.lazyPut(() => EditDefaultIdentityInteractor(
Get.find<IdentityRepository>(), Get.find<IdentityRepository>(),
Get.find<IdentityUtils>())); Get.find<IdentityUtils>()));
Get.lazyPut(() => TransformHtmlSignatureInteractor(Get.find<IdentityRepository>()));
} }
@override @override
@@ -2,8 +2,10 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:fading_edge_scrollview/fading_edge_scrollview.dart'; import 'package:fading_edge_scrollview/fading_edge_scrollview.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get_state_manager/get_state_manager.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/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/identity_list_tile_builder.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/widgets/signature_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), _buildListIdentityView(context),
Container(height: 1, color: AppColor.attachmentFileBorderColor), 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 else
_buildListIdentityView(context) _buildListIdentityView(context)
@@ -62,9 +70,13 @@ class IdentitiesRadioListBuilder extends StatelessWidget {
...[ ...[
_buildListIdentityView(context), _buildListIdentityView(context),
Container(width: 1, color: AppColor.attachmentFileBorderColor), Container(width: 1, color: AppColor.attachmentFileBorderColor),
Expanded( Expanded(child: Obx(() {
child: Obx(() => SignatureBuilder(identity: controller.identitySelected.value!)), if (controller.signatureSelected.value != null) {
) return SignatureBuilder(controller.signatureSelected.value!);
} else {
return _buildLoadingView();
}
}))
] ]
else else
Expanded(child: _buildListIdentityView(context)) 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();
}
}
));
}
} }
@@ -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_on_web_widget.dart';
import 'package:core/presentation/views/html_viewer/html_content_viewer_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/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:core/utils/build_utils.dart';
import 'package:flutter/material.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 { class SignatureBuilder extends StatelessWidget {
const SignatureBuilder({ const SignatureBuilder(
this.signatureSelected, {
Key? key, Key? key,
required this.identity,
this.width, this.width,
this.height = 256 this.height = 256
}) : super(key: key); }) : super(key: key);
final Identity identity; final String signatureSelected;
final double? width; final double? width;
final double height; final double height;
@@ -38,13 +34,10 @@ class SignatureBuilder extends StatelessWidget {
} }
Widget _buildSignature(double width, double height) { Widget _buildSignature(double width, double height) {
final signature = identity.signatureAsString; if (signatureSelected.isNotEmpty) {
log('SignatureBuilder::_buildSignature():signature: $signature');
if (signature.isNotEmpty) {
final htmlSignatureDecoded = _decodeHtml(signature);
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
return HtmlContentViewerOnWeb( return HtmlContentViewerOnWeb(
contentHtml: htmlSignatureDecoded, contentHtml: signatureSelected,
widthContent: width, widthContent: width,
heightContent: height, heightContent: height,
controller: HtmlViewerControllerForWeb(), controller: HtmlViewerControllerForWeb(),
@@ -52,7 +45,7 @@ class SignatureBuilder extends StatelessWidget {
); );
} else { } else {
return HtmlContentViewer( return HtmlContentViewer(
contentHtml: htmlSignatureDecoded, contentHtml: signatureSelected,
heightContent: height heightContent: height
); );
} }
@@ -60,9 +53,4 @@ class SignatureBuilder extends StatelessWidget {
return SizedBox(width: width, height: height); return SizedBox(width: width, height: height);
} }
} }
String _decodeHtml(String htmlString) {
final unescape = HtmlUnescape();
return unescape.convert(htmlString);
}
} }