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;
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<HtmlContentViewerOnWeb> {
return false;
}
return url.protocol === "http:" || url.protocol === "https:" || url.protocol === "mailto:";
return url.protocol === "mailto:";
}
</script>
''';
@@ -232,8 +232,6 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb> {
final urlString = link as String;
if (urlString.startsWith('mailto:')) {
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/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<Identity>();
final signatureSelected = Rxn<String>();
final listAllIdentities = <Identity>[].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 {
@@ -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<CreateNewIdentityInteractor>(),
Get.find<EditIdentityInteractor>(),
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_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<IdentityRepository>(),
Get.find<IdentityUtils>()));
Get.lazyPut(() => TransformHtmlSignatureInteractor(Get.find<IdentityRepository>()));
}
@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/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();
}
}
));
}
}
@@ -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);
}
}