TF-1684 Implement handle transform html signature
(cherry picked from commit cc535a6cf418d27b59e121ae6cd3dc57c065ddf3)
This commit is contained in:
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-1
@@ -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>()
|
||||
));
|
||||
}
|
||||
}
|
||||
+2
@@ -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
|
||||
|
||||
+38
-4
@@ -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();
|
||||
}
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
+6
-18
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user