TF-1512 Display signature content correct in identity creator

This commit is contained in:
dab246
2023-03-01 16:03:05 +07:00
committed by Dat Vu
parent 3f522445a9
commit b4bdc70ba0
2 changed files with 94 additions and 103 deletions
@@ -1,9 +1,7 @@
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/build_utils.dart'; import 'package:core/utils/build_utils.dart';
import 'package:enough_html_editor/enough_html_editor.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:get/get_core/get_core.dart'; import 'package:get/get_core/get_core.dart';
import 'package:get/get_instance/get_instance.dart'; import 'package:get/get_instance/get_instance.dart';
import 'package:get/get_rx/get_rx.dart'; import 'package:get/get_rx/get_rx.dart';
@@ -19,7 +17,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart'; import 'package:model/model.dart';
import 'package:rich_text_composer/richtext_controller.dart'; import 'package:rich_text_composer/richtext_controller.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
@@ -32,6 +29,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_id
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.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/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/presentation/extensions/identity_extension.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/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/error/capability_validator.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart';
@@ -63,7 +61,6 @@ class IdentityCreatorController extends BaseController {
late RichTextController keyboardRichTextController; late RichTextController keyboardRichTextController;
late RichTextWebController richTextWebController; late RichTextWebController richTextWebController;
late RichTextMobileTabletController richTextMobileTabletController;
late HtmlEditorController signatureHtmlEditorController; late HtmlEditorController signatureHtmlEditorController;
TextEditingController? inputNameIdentityController; TextEditingController? inputNameIdentityController;
TextEditingController? inputBccIdentityController; TextEditingController? inputBccIdentityController;
@@ -78,9 +75,10 @@ class IdentityCreatorController extends BaseController {
IdentityCreatorArguments? arguments; IdentityCreatorArguments? arguments;
OnCreatedIdentityCallback? onCreatedIdentityCallback; OnCreatedIdentityCallback? onCreatedIdentityCallback;
VoidCallback? onDismissIdentityCreator; VoidCallback? onDismissIdentityCreator;
ScrollController? scrollController;
final ScrollController scrollController = ScrollController();
final GlobalKey htmlKey = GlobalKey(); final GlobalKey htmlKey = GlobalKey();
final htmlEditorMinHeight = 160;
void updateNameIdentity(BuildContext context, String? value) { void updateNameIdentity(BuildContext context, String? value) {
_nameIdentity = value; _nameIdentity = value;
@@ -89,9 +87,13 @@ class IdentityCreatorController extends BaseController {
void updateContentHtmlEditor(String? text) => _contentHtmlEditor = text; void updateContentHtmlEditor(String? text) => _contentHtmlEditor = text;
HtmlEditorApi? get signatureHtmlEditorMobileController => richTextMobileTabletController.htmlEditorApi; String? get contentHtmlEditor {
if (_contentHtmlEditor != null) {
String? get contentHtmlEditor => _contentHtmlEditor ?? arguments?.identity?.htmlSignature?.value; return _contentHtmlEditor;
} else {
return arguments?.identity?.signatureAsString;
}
}
IdentityCreatorController( IdentityCreatorController(
this._verifyNameInteractor, this._verifyNameInteractor,
@@ -104,13 +106,10 @@ class IdentityCreatorController extends BaseController {
super.onInit(); super.onInit();
keyboardRichTextController = RichTextController(); keyboardRichTextController = RichTextController();
richTextWebController = RichTextWebController(); richTextWebController = RichTextWebController();
richTextMobileTabletController = RichTextMobileTabletController(); signatureHtmlEditorController = HtmlEditorController(processNewLineAsBr: true);
signatureHtmlEditorController =
HtmlEditorController(processNewLineAsBr: true);
inputNameIdentityController = TextEditingController(); inputNameIdentityController = TextEditingController();
inputBccIdentityController = TextEditingController(); inputBccIdentityController = TextEditingController();
inputNameIdentityFocusNode = FocusNode(); inputNameIdentityFocusNode = FocusNode();
scrollController = ScrollController();
} }
@override @override
@@ -291,7 +290,7 @@ class IdentityCreatorController extends BaseController {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
return signatureHtmlEditorController.getText(); return signatureHtmlEditorController.getText();
} else { } else {
return signatureHtmlEditorMobileController?.getText(); return keyboardRichTextController.htmlEditorApi?.getText();
} }
} }
@@ -423,11 +422,9 @@ class IdentityCreatorController extends BaseController {
void clearFocusEditor(BuildContext context) { void clearFocusEditor(BuildContext context) {
if (!BuildUtils.isWeb) { if (!BuildUtils.isWeb) {
signatureHtmlEditorMobileController?.unfocus(); keyboardRichTextController.htmlEditorApi?.unfocus();
richTextMobileTabletController.htmlEditorApi?.unfocus();
keyboardRichTextController.hideRichTextView();
} }
SystemChannels.textInput.invokeMethod('TextInput.hide'); FocusScope.of(context).unfocus();
} }
void closeView(BuildContext context) { void closeView(BuildContext context) {
@@ -447,28 +444,29 @@ class IdentityCreatorController extends BaseController {
inputNameIdentityController = null; inputNameIdentityController = null;
inputBccIdentityController?.dispose(); inputBccIdentityController?.dispose();
inputBccIdentityController = null; inputBccIdentityController = null;
scrollController?.dispose(); scrollController.dispose();
scrollController = null;
} }
void onFocusHTMLEditor() async { void onFocusHTMLEditorOnMobile() async {
await Scrollable.ensureVisible(htmlKey.currentContext!); if (htmlKey.currentContext != null) {
await Scrollable.ensureVisible(htmlKey.currentContext!);
}
await Future.delayed(const Duration(milliseconds: 500), () { await Future.delayed(const Duration(milliseconds: 500), () {
if (scrollController != null) { final offset = scrollController.position.pixels +
scrollController!.animateTo( defaultKeyboardToolbarHeight +
scrollController!.position.pixels + defaultKeyboardToolbarHeight, htmlEditorMinHeight;
duration: const Duration(milliseconds: 1), scrollController.animateTo(
curve: Curves.linear, offset,
); duration: const Duration(milliseconds: 1),
} curve: Curves.linear,
);
}); });
} }
void onEnterKeyDown() { void onEnterKeyDownOnMobile() {
if(scrollController != null && if(scrollController.position.pixels < scrollController.position.maxScrollExtent) {
scrollController!.position.pixels < scrollController!.position.maxScrollExtent) { scrollController.animateTo(
scrollController!.animateTo( scrollController.position.pixels + 20,
scrollController!.position.pixels + 20,
duration: const Duration(milliseconds: 1), duration: const Duration(milliseconds: 1),
curve: Curves.linear, curve: Curves.linear,
); );
@@ -54,10 +54,10 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
onTap: () => controller.clearFocusEditor(context), onTap: () => controller.clearFocusEditor(context),
child: SizedBox( child: SizedBox(
height: MediaQuery.of(context).size.height * 0.95, height: MediaQuery.of(context).size.height * 0.95,
child: SafeArea( child: BuildUtils.isWeb
child: BuildUtils.isWeb ? Scaffold(body: _buildBodyMobile(context)) : _buildBodyMobile(context), ? Scaffold(body: _buildBodyMobile(context))
), : _buildBodyMobile(context)
) )
), ),
landscapeMobile: Scaffold( landscapeMobile: Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
@@ -164,7 +164,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
child: Padding( child: Padding(
padding: const EdgeInsets.all(24.0), padding: const EdgeInsets.all(24.0),
child: Column(children: [ child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Obx(() => (IdentityInputFieldBuilder( Obx(() => (IdentityInputFieldBuilder(
AppLocalizations.of(context).name, AppLocalizations.of(context).name,
controller.errorNameIdentity.value, controller.errorNameIdentity.value,
@@ -237,9 +237,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
const SizedBox(height: 8), const SizedBox(height: 8),
PointerInterceptor( PointerInterceptor(
child: Container( child: Container(
height: 300,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColor.colorInputBorderCreateMailbox), border: Border.all(color: AppColor.colorInputBorderCreateMailbox),
color: Colors.white, color: Colors.white,
), ),
@@ -361,84 +360,78 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
? _buildHtmlEditorWeb(context, controller.contentHtmlEditor ?? '') ? _buildHtmlEditorWeb(context, controller.contentHtmlEditor ?? '')
: _buildHtmlEditor(context, initialContent: controller.contentHtmlEditor ?? ''); : _buildHtmlEditor(context, initialContent: controller.contentHtmlEditor ?? '');
return SizedBox( return Column(
height: 300, children: [
child: Column( if(BuildUtils.isWeb)
children: [ ToolbarRichTextWebBuilder(
if(BuildUtils.isWeb) richTextWebController: controller.richTextWebController,
ToolbarRichTextWebBuilder( padding: const EdgeInsets.only(top: 22, bottom: 8.0, left: 24, right: 12)),
richTextWebController: controller.richTextWebController, htmlEditor,
padding: const EdgeInsets.only(top: 22, bottom: 8.0, left: 24, right: 12)), ],
htmlEditor,
],
),
); );
} }
Widget _buildHtmlEditorWeb(BuildContext context, String initContent) { Widget _buildHtmlEditorWeb(BuildContext context, String initContent) {
log('IdentityCreatorView::_buildHtmlEditorWeb(): initContent: $initContent'); log('IdentityCreatorView::_buildHtmlEditorWeb(): initContent: $initContent');
return Expanded( return Padding(
child: Padding( padding: const EdgeInsets.only(left: 14.0, right: 2.0),
padding: const EdgeInsets.only(left: 14.0, right: 2.0), child: html_editor_browser.HtmlEditor(
child: html_editor_browser.HtmlEditor( key: const Key('identity_create_editor_web'),
key: const Key('identity_create_editor_web'), controller: controller.richTextWebController.editorController,
controller: controller.richTextWebController.editorController, htmlEditorOptions: const HtmlEditorOptions(
htmlEditorOptions: const HtmlEditorOptions( hint: '',
hint: '', darkMode: false,
darkMode: false, customBodyCssStyle: bodyCssStyleForEditor),
customBodyCssStyle: bodyCssStyleForEditor), blockQuotedContent: initContent,
blockQuotedContent: initContent, htmlToolbarOptions: const HtmlToolbarOptions(
htmlToolbarOptions: const HtmlToolbarOptions( toolbarType: ToolbarType.hide,
toolbarType: ToolbarType.hide, defaultToolbarButtons: []),
defaultToolbarButtons: []), otherOptions: const OtherOptions(height: 150),
otherOptions: const OtherOptions(height: 550), callbacks: Callbacks(onBeforeCommand: (currentHtml) {
callbacks: Callbacks(onBeforeCommand: (currentHtml) { log('IdentityCreatorView::_buildHtmlEditorWeb(): onBeforeCommand : $currentHtml');
log('IdentityCreatorView::_buildHtmlEditorWeb(): onBeforeCommand : $currentHtml'); controller.updateContentHtmlEditor(currentHtml);
controller.updateContentHtmlEditor(currentHtml); }, onChangeContent: (changed) {
}, onChangeContent: (changed) { log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeContent : $changed');
log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeContent : $changed'); controller.updateContentHtmlEditor(changed);
controller.updateContentHtmlEditor(changed); }, onInit: () {
}, onInit: () { log('IdentityCreatorView::_buildHtmlEditorWeb(): onInit');
log('IdentityCreatorView::_buildHtmlEditorWeb(): onInit'); controller.updateContentHtmlEditor(initContent);
controller.updateContentHtmlEditor(initContent); controller.richTextWebController.setFullScreenEditor();
controller.richTextWebController.setFullScreenEditor(); controller.richTextWebController.setEnableCodeView();
controller.richTextWebController.setEnableCodeView(); }, onFocus: () {
}, onFocus: () { log('IdentityCreatorView::_buildHtmlEditorWeb(): onFocus');
log('IdentityCreatorView::_buildHtmlEditorWeb(): onFocus'); FocusManager.instance.primaryFocus?.unfocus();
FocusManager.instance.primaryFocus?.unfocus(); Future.delayed(const Duration(milliseconds: 500), () {
Future.delayed(const Duration(milliseconds: 500), () { controller.richTextWebController.editorController.setFocus();
controller.richTextWebController.editorController.setFocus(); });
}); controller.richTextWebController.closeAllMenuPopup();
controller.richTextWebController.closeAllMenuPopup(); }, onChangeSelection: (settings) {
}, onChangeSelection: (settings) { controller.richTextWebController.onEditorSettingsChange(settings);
controller.richTextWebController.onEditorSettingsChange(settings); }, onChangeCodeview: (contentChanged) {
}, onChangeCodeview: (contentChanged) { log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeCodeView : $contentChanged');
log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeCodeView : $contentChanged'); controller.updateContentHtmlEditor(contentChanged);
controller.updateContentHtmlEditor(contentChanged); }),
}),
),
), ),
); );
} }
Widget _buildHtmlEditor(BuildContext context, {String? initialContent}) { Widget _buildHtmlEditor(BuildContext context, {String? initialContent}) {
final richTextMobileTabletController = controller.richTextMobileTabletController; return Padding(
return Focus( padding: const EdgeInsets.all(16),
focusNode: controller.htmlEditorNode,
child: html_editor_mobile.HtmlEditor( child: html_editor_mobile.HtmlEditor(
key: const Key('identity_create_editor'), key: controller.htmlKey,
minHeight: 111, minHeight: controller.htmlEditorMinHeight,
addDefaultSelectionMenuItems: false, addDefaultSelectionMenuItems: false,
initialContent: initialContent ?? '', initialContent: initialContent ?? '',
onCreated: (editorApi) { onCreated: (editorApi) {
richTextMobileTabletController.htmlEditorApi = editorApi; controller.keyboardRichTextController.onCreateHTMLEditor(
controller.keyboardRichTextController.onCreateHTMLEditor( editorApi,
editorApi, onEnterKeyDown: controller.onEnterKeyDownOnMobile,
onEnterKeyDown: controller.onEnterKeyDown, onFocus: controller.onFocusHTMLEditorOnMobile,
context: context, context: context
); );
}, },
) ),
); );
} }