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';
class VacationUtils {
static const String vacationTagName = 'Vacation';
static EdgeInsets getPaddingView(BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isDesktop(context)) {
return const EdgeInsets.symmetric(vertical: 24, horizontal: 20);
@@ -25,33 +25,34 @@ class VacationController extends BaseController {
final _settingController = Get.find<SettingsController>();
final UpdateVacationInteractor _updateVacationInteractor;
final RichTextWebController _richTextControllerForWeb;
final vacationPresentation = VacationPresentation.initialize().obs;
final errorMessageBody = Rxn<String>();
final subjectTextController = TextEditingController();
final subjectTextFocusNode = FocusNode();
final richTextControllerForMobile = RichTextController();
final GlobalKey htmlKey = GlobalKey();
VacationResponse? currentVacation;
String? _vacationMessageHtmlText;
RichTextController? richTextControllerForMobile;
RichTextWebController? richTextControllerForWeb;
final ScrollController scrollController = ScrollController();
VacationController(
this._updateVacationInteractor,
this._richTextControllerForWeb
);
VacationController(this._updateVacationInteractor);
String? get vacationMessageHtmlText => _vacationMessageHtmlText;
RichTextWebController get richTextControllerForWeb => _richTextControllerForWeb;
@override
void onInit() {
if (PlatformInfo.isWeb) {
richTextControllerForWeb = RichTextWebController();
} else {
richTextControllerForMobile = RichTextController();
}
_initWorker();
_initFocusListener();
super.onInit();
@@ -82,7 +83,7 @@ class VacationController extends BaseController {
void _onSubjectTextListener() {
if (subjectTextFocusNode.hasFocus && PlatformInfo.isMobile) {
richTextControllerForMobile.hideRichTextView();
richTextControllerForMobile?.hideRichTextView();
}
}
@@ -91,9 +92,9 @@ class VacationController extends BaseController {
subjectTextController.text = newVacation.subject ?? '';
updateMessageHtmlText(newVacation.messageHtmlText ?? '');
if (PlatformInfo.isWeb) {
_richTextControllerForWeb.editorController.setText(newVacation.messageHtmlText ?? '');
richTextControllerForWeb?.editorController.setText(newVacation.messageHtmlText ?? '');
} 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 {
if (PlatformInfo.isMobile) {
richTextControllerForMobile.htmlEditorApi?.unfocus();
richTextControllerForMobile?.htmlEditorApi?.unfocus();
}
FocusScope.of(context).unfocus();
@@ -177,7 +178,7 @@ class VacationController extends BaseController {
void selectTime(BuildContext context, DateType dateType, TimeOfDay? currentTime) async {
if (PlatformInfo.isMobile) {
richTextControllerForMobile.htmlEditorApi?.unfocus();
richTextControllerForMobile?.htmlEditorApi?.unfocus();
}
FocusScope.of(context).unfocus();
@@ -298,15 +299,15 @@ class VacationController extends BaseController {
Future<String>? _getMessageHtmlText() {
if (PlatformInfo.isWeb) {
return _richTextControllerForWeb.editorController.getText();
return richTextControllerForWeb?.editorController.getText();
} else {
return richTextControllerForMobile.htmlEditorApi?.getText();
return richTextControllerForMobile?.htmlEditorApi?.getText();
}
}
void clearFocusEditor(BuildContext context) {
if (PlatformInfo.isMobile) {
richTextControllerForMobile.htmlEditorApi?.unfocus();
richTextControllerForMobile?.htmlEditorApi?.unfocus();
}
KeyboardUtils.hideKeyboard(context);
}
@@ -317,7 +318,7 @@ class VacationController extends BaseController {
}
void initRichTextForMobile(BuildContext context, HtmlEditorApi editorApi) {
richTextControllerForMobile.onCreateHTMLEditor(
richTextControllerForMobile?.onCreateHTMLEditor(
editorApi,
onFocus: () => onFocusHTMLEditor(context),
onEnterKeyDown: onEnterKeyDown,
@@ -329,7 +330,7 @@ class VacationController extends BaseController {
FocusScope.of(context).unfocus();
await Future.delayed(
const Duration(milliseconds: 300),
richTextControllerForMobile.showDeviceKeyboard);
richTextControllerForMobile?.showDeviceKeyboard);
}
subjectTextFocusNode.unfocus();
@@ -359,8 +360,12 @@ class VacationController extends BaseController {
subjectTextFocusNode.removeListener(_onSubjectTextListener);
subjectTextFocusNode.dispose();
subjectTextController.dispose();
richTextControllerForMobile.dispose();
scrollController.dispose();
if (PlatformInfo.isWeb) {
richTextControllerForWeb?.onClose();
} else {
richTextControllerForMobile?.dispose();
}
super.onClose();
}
}
@@ -1,8 +1,6 @@
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/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';
class VacationControllerBindings extends Bindings {
@@ -10,10 +8,6 @@ class VacationControllerBindings extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => VerifyNameInteractor());
Get.lazyPut(() => RichTextWebController(), tag: VacationUtils.vacationTagName);
Get.put(VacationController(
Get.find<UpdateVacationInteractor>(),
Get.find<RichTextWebController>(tag: VacationUtils.vacationTagName),
));
Get.put(VacationController(Get.find<UpdateVacationInteractor>()));
}
}
@@ -289,7 +289,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
top: false,
right: controller.responsiveUtils.isPortraitMobile(context),
child: KeyboardRichText(
richTextController: controller.richTextControllerForMobile,
richTextController: controller.richTextControllerForMobile!,
keyBroadToolbar: RichTextKeyboardToolBar(
rootContext: context,
titleBack: AppLocalizations.of(context).format,
@@ -297,7 +297,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid,
formatLabel: AppLocalizations.of(context).format,
richTextController: controller.richTextControllerForMobile,
richTextController: controller.richTextControllerForMobile!,
quickStyleLabel: AppLocalizations.of(context).quickStyles,
backgroundLabel: AppLocalizations.of(context).background,
foregroundLabel: AppLocalizations.of(context).foreground,
@@ -323,7 +323,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
backgroundColor: SettingsUtils.getBackgroundColor(context, controller.responsiveUtils),
body: SafeArea(
child: KeyboardRichText(
richTextController: controller.richTextControllerForMobile,
richTextController: controller.richTextControllerForMobile!,
keyBroadToolbar: RichTextKeyboardToolBar(
rootContext: context,
titleBack: AppLocalizations.of(context).format,
@@ -331,7 +331,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
? AppColor.colorBackgroundKeyboard
: AppColor.colorBackgroundKeyboardAndroid,
formatLabel: AppLocalizations.of(context).format,
richTextController: controller.richTextControllerForMobile,
richTextController: controller.richTextControllerForMobile!,
quickStyleLabel: AppLocalizations.of(context).quickStyles,
backgroundLabel: AppLocalizations.of(context).background,
foregroundLabel: AppLocalizations.of(context).foreground,
@@ -462,7 +462,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
child: PointerInterceptor(
child: buildToolbarRichTextForWeb(
context,
controller.richTextControllerForWeb,
controller.richTextControllerForWeb!,
layoutType: ButtonLayoutType.scrollHorizontal
)
)
@@ -477,7 +477,7 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
constraints: const BoxConstraints(maxHeight: 300),
child: html_editor_browser.HtmlEditor(
key: const Key('vacation_message_html_text_editor_web'),
controller: controller.richTextControllerForWeb.editorController,
controller: controller.richTextControllerForWeb!.editorController,
htmlEditorOptions: html_editor_browser.HtmlEditorOptions(
hint: '',
darkMode: false,
@@ -491,14 +491,14 @@ class VacationView extends GetWidget<VacationController> with RichTextButtonMixi
defaultToolbarButtons: []),
otherOptions: const html_editor_browser.OtherOptions(height: 150),
callbacks: html_editor_browser.Callbacks(
onChangeSelection: controller.richTextControllerForWeb.onEditorSettingsChange,
onChangeSelection: controller.richTextControllerForWeb?.onEditorSettingsChange,
onChangeContent: controller.updateMessageHtmlText,
onFocus: () {
KeyboardUtils.hideKeyboard(context);
Future.delayed(const Duration(milliseconds: 500), () {
controller.richTextControllerForWeb.editorController.setFocus();
controller.richTextControllerForWeb?.editorController.setFocus();
});
controller.richTextControllerForWeb.closeAllMenuPopup();
controller.richTextControllerForWeb?.closeAllMenuPopup();
}
),
),