Use the correct rich text controller for each platform to avoid errors

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-04 14:18:21 +07:00
committed by Dat H. Pham
parent 1b0b8e190c
commit da8b4b7f58
4 changed files with 34 additions and 37 deletions
@@ -3,8 +3,6 @@ import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class VacationUtils { class VacationUtils {
static const String vacationTagName = 'Vacation';
static EdgeInsets getPaddingView(BuildContext context, ResponsiveUtils responsiveUtils) { static EdgeInsets getPaddingView(BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isDesktop(context)) { if (responsiveUtils.isDesktop(context)) {
return const EdgeInsets.symmetric(vertical: 24, horizontal: 20); return const EdgeInsets.symmetric(vertical: 24, horizontal: 20);
@@ -25,33 +25,34 @@ class VacationController extends BaseController {
final _settingController = Get.find<SettingsController>(); final _settingController = Get.find<SettingsController>();
final UpdateVacationInteractor _updateVacationInteractor; final UpdateVacationInteractor _updateVacationInteractor;
final RichTextWebController _richTextControllerForWeb;
final vacationPresentation = VacationPresentation.initialize().obs; final vacationPresentation = VacationPresentation.initialize().obs;
final errorMessageBody = Rxn<String>(); final errorMessageBody = Rxn<String>();
final subjectTextController = TextEditingController(); final subjectTextController = TextEditingController();
final subjectTextFocusNode = FocusNode(); final subjectTextFocusNode = FocusNode();
final richTextControllerForMobile = RichTextController();
final GlobalKey htmlKey = GlobalKey(); final GlobalKey htmlKey = GlobalKey();
VacationResponse? currentVacation; VacationResponse? currentVacation;
String? _vacationMessageHtmlText; String? _vacationMessageHtmlText;
RichTextController? richTextControllerForMobile;
RichTextWebController? richTextControllerForWeb;
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
VacationController( VacationController(this._updateVacationInteractor);
this._updateVacationInteractor,
this._richTextControllerForWeb
);
String? get vacationMessageHtmlText => _vacationMessageHtmlText; String? get vacationMessageHtmlText => _vacationMessageHtmlText;
RichTextWebController get richTextControllerForWeb => _richTextControllerForWeb;
@override @override
void onInit() { void onInit() {
if (PlatformInfo.isWeb) {
richTextControllerForWeb = RichTextWebController();
} else {
richTextControllerForMobile = RichTextController();
}
_initWorker(); _initWorker();
_initFocusListener(); _initFocusListener();
super.onInit(); super.onInit();
@@ -82,7 +83,7 @@ class VacationController extends BaseController {
void _onSubjectTextListener() { void _onSubjectTextListener() {
if (subjectTextFocusNode.hasFocus && PlatformInfo.isMobile) { if (subjectTextFocusNode.hasFocus && PlatformInfo.isMobile) {
richTextControllerForMobile.hideRichTextView(); richTextControllerForMobile?.hideRichTextView();
} }
} }
@@ -91,9 +92,9 @@ class VacationController extends BaseController {
subjectTextController.text = newVacation.subject ?? ''; subjectTextController.text = newVacation.subject ?? '';
updateMessageHtmlText(newVacation.messageHtmlText ?? ''); updateMessageHtmlText(newVacation.messageHtmlText ?? '');
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
_richTextControllerForWeb.editorController.setText(newVacation.messageHtmlText ?? ''); richTextControllerForWeb?.editorController.setText(newVacation.messageHtmlText ?? '');
} else { } else {
richTextControllerForMobile.htmlEditorApi?.setText(newVacation.messageHtmlText ?? ''); richTextControllerForMobile?.htmlEditorApi?.setText(newVacation.messageHtmlText ?? '');
} }
} }
@@ -131,7 +132,7 @@ class VacationController extends BaseController {
void selectDate(BuildContext context, DateType dateType, DateTime? currentDate) async { void selectDate(BuildContext context, DateType dateType, DateTime? currentDate) async {
if (PlatformInfo.isMobile) { if (PlatformInfo.isMobile) {
richTextControllerForMobile.htmlEditorApi?.unfocus(); richTextControllerForMobile?.htmlEditorApi?.unfocus();
} }
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
@@ -177,7 +178,7 @@ class VacationController extends BaseController {
void selectTime(BuildContext context, DateType dateType, TimeOfDay? currentTime) async { void selectTime(BuildContext context, DateType dateType, TimeOfDay? currentTime) async {
if (PlatformInfo.isMobile) { if (PlatformInfo.isMobile) {
richTextControllerForMobile.htmlEditorApi?.unfocus(); richTextControllerForMobile?.htmlEditorApi?.unfocus();
} }
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
@@ -298,15 +299,15 @@ class VacationController extends BaseController {
Future<String>? _getMessageHtmlText() { Future<String>? _getMessageHtmlText() {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
return _richTextControllerForWeb.editorController.getText(); return richTextControllerForWeb?.editorController.getText();
} else { } else {
return richTextControllerForMobile.htmlEditorApi?.getText(); return richTextControllerForMobile?.htmlEditorApi?.getText();
} }
} }
void clearFocusEditor(BuildContext context) { void clearFocusEditor(BuildContext context) {
if (PlatformInfo.isMobile) { if (PlatformInfo.isMobile) {
richTextControllerForMobile.htmlEditorApi?.unfocus(); richTextControllerForMobile?.htmlEditorApi?.unfocus();
} }
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
} }
@@ -317,7 +318,7 @@ class VacationController extends BaseController {
} }
void initRichTextForMobile(BuildContext context, HtmlEditorApi editorApi) { void initRichTextForMobile(BuildContext context, HtmlEditorApi editorApi) {
richTextControllerForMobile.onCreateHTMLEditor( richTextControllerForMobile?.onCreateHTMLEditor(
editorApi, editorApi,
onFocus: () => onFocusHTMLEditor(context), onFocus: () => onFocusHTMLEditor(context),
onEnterKeyDown: onEnterKeyDown, onEnterKeyDown: onEnterKeyDown,
@@ -329,7 +330,7 @@ class VacationController extends BaseController {
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
await Future.delayed( await Future.delayed(
const Duration(milliseconds: 300), const Duration(milliseconds: 300),
richTextControllerForMobile.showDeviceKeyboard); richTextControllerForMobile?.showDeviceKeyboard);
} }
subjectTextFocusNode.unfocus(); subjectTextFocusNode.unfocus();
@@ -359,8 +360,12 @@ class VacationController extends BaseController {
subjectTextFocusNode.removeListener(_onSubjectTextListener); subjectTextFocusNode.removeListener(_onSubjectTextListener);
subjectTextFocusNode.dispose(); subjectTextFocusNode.dispose();
subjectTextController.dispose(); subjectTextController.dispose();
richTextControllerForMobile.dispose();
scrollController.dispose(); scrollController.dispose();
if (PlatformInfo.isWeb) {
richTextControllerForWeb?.onClose();
} else {
richTextControllerForMobile?.dispose();
}
super.onClose(); super.onClose();
} }
} }
@@ -1,8 +1,6 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_vacation_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/utils/vacation_utils.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_controller.dart';
class VacationControllerBindings extends Bindings { class VacationControllerBindings extends Bindings {
@@ -10,10 +8,6 @@ class VacationControllerBindings extends Bindings {
@override @override
void dependencies() { void dependencies() {
Get.lazyPut(() => VerifyNameInteractor()); Get.lazyPut(() => VerifyNameInteractor());
Get.lazyPut(() => RichTextWebController(), tag: VacationUtils.vacationTagName); Get.put(VacationController(Get.find<UpdateVacationInteractor>()));
Get.put(VacationController(
Get.find<UpdateVacationInteractor>(),
Get.find<RichTextWebController>(tag: VacationUtils.vacationTagName),
));
} }
} }
@@ -289,7 +289,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
top: false, top: false,
right: controller.responsiveUtils.isPortraitMobile(context), right: controller.responsiveUtils.isPortraitMobile(context),
child: KeyboardRichText( child: KeyboardRichText(
richTextController: controller.richTextControllerForMobile, richTextController: controller.richTextControllerForMobile!,
keyBroadToolbar: RichTextKeyboardToolBar( keyBroadToolbar: RichTextKeyboardToolBar(
rootContext: context, rootContext: context,
titleBack: AppLocalizations.of(context).format, titleBack: AppLocalizations.of(context).format,
@@ -297,7 +297,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
? AppColor.colorBackgroundKeyboard ? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid, : AppColor.colorBackgroundKeyboardAndroid,
formatLabel: AppLocalizations.of(context).format, formatLabel: AppLocalizations.of(context).format,
richTextController: controller.richTextControllerForMobile, richTextController: controller.richTextControllerForMobile!,
quickStyleLabel: AppLocalizations.of(context).quickStyles, quickStyleLabel: AppLocalizations.of(context).quickStyles,
backgroundLabel: AppLocalizations.of(context).background, backgroundLabel: AppLocalizations.of(context).background,
foregroundLabel: AppLocalizations.of(context).foreground, foregroundLabel: AppLocalizations.of(context).foreground,
@@ -323,7 +323,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
backgroundColor: SettingsUtils.getBackgroundColor(context, controller.responsiveUtils), backgroundColor: SettingsUtils.getBackgroundColor(context, controller.responsiveUtils),
body: SafeArea( body: SafeArea(
child: KeyboardRichText( child: KeyboardRichText(
richTextController: controller.richTextControllerForMobile, richTextController: controller.richTextControllerForMobile!,
keyBroadToolbar: RichTextKeyboardToolBar( keyBroadToolbar: RichTextKeyboardToolBar(
rootContext: context, rootContext: context,
titleBack: AppLocalizations.of(context).format, titleBack: AppLocalizations.of(context).format,
@@ -331,7 +331,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
? AppColor.colorBackgroundKeyboard ? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid, : AppColor.colorBackgroundKeyboardAndroid,
formatLabel: AppLocalizations.of(context).format, formatLabel: AppLocalizations.of(context).format,
richTextController: controller.richTextControllerForMobile, richTextController: controller.richTextControllerForMobile!,
quickStyleLabel: AppLocalizations.of(context).quickStyles, quickStyleLabel: AppLocalizations.of(context).quickStyles,
backgroundLabel: AppLocalizations.of(context).background, backgroundLabel: AppLocalizations.of(context).background,
foregroundLabel: AppLocalizations.of(context).foreground, foregroundLabel: AppLocalizations.of(context).foreground,
@@ -462,7 +462,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
child: PointerInterceptor( child: PointerInterceptor(
child: buildToolbarRichTextForWeb( child: buildToolbarRichTextForWeb(
context, context,
controller.richTextControllerForWeb, controller.richTextControllerForWeb!,
layoutType: ButtonLayoutType.scrollHorizontal layoutType: ButtonLayoutType.scrollHorizontal
) )
) )
@@ -477,7 +477,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
constraints: const BoxConstraints(maxHeight: 300), constraints: const BoxConstraints(maxHeight: 300),
child: html_editor_browser.HtmlEditor( child: html_editor_browser.HtmlEditor(
key: const Key('vacation_message_html_text_editor_web'), key: const Key('vacation_message_html_text_editor_web'),
controller: controller.richTextControllerForWeb.editorController, controller: controller.richTextControllerForWeb!.editorController,
htmlEditorOptions: html_editor_browser.HtmlEditorOptions( htmlEditorOptions: html_editor_browser.HtmlEditorOptions(
hint: '', hint: '',
darkMode: false, darkMode: false,
@@ -491,14 +491,14 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
defaultToolbarButtons: []), defaultToolbarButtons: []),
otherOptions: const html_editor_browser.OtherOptions(height: 150), otherOptions: const html_editor_browser.OtherOptions(height: 150),
callbacks: html_editor_browser.Callbacks( callbacks: html_editor_browser.Callbacks(
onChangeSelection: controller.richTextControllerForWeb.onEditorSettingsChange, onChangeSelection: controller.richTextControllerForWeb?.onEditorSettingsChange,
onChangeContent: controller.updateMessageHtmlText, onChangeContent: controller.updateMessageHtmlText,
onFocus: () { onFocus: () {
KeyboardUtils.hideKeyboard(context); KeyboardUtils.hideKeyboard(context);
Future.delayed(const Duration(milliseconds: 500), () { Future.delayed(const Duration(milliseconds: 500), () {
controller.richTextControllerForWeb.editorController.setFocus(); controller.richTextControllerForWeb?.editorController.setFocus();
}); });
controller.richTextControllerForWeb.closeAllMenuPopup(); controller.richTextControllerForWeb?.closeAllMenuPopup();
} }
), ),
), ),