From 2228596c1ce43c27b16c4fd5ee70c78063f62944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Poizat?= Date: Thu, 11 Dec 2025 11:03:23 +0100 Subject: [PATCH] Mutualize event listener in web editor widget Instead of listening multiple times for message from editor JS side, let's add only one listener and route inside the callback. --- .../widgets/web/web_editor_widget.dart | 46 ++++++------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/lib/features/composer/presentation/widgets/web/web_editor_widget.dart b/lib/features/composer/presentation/widgets/web/web_editor_widget.dart index f4bde89f8..d2ecc749f 100644 --- a/lib/features/composer/presentation/widgets/web/web_editor_widget.dart +++ b/lib/features/composer/presentation/widgets/web/web_editor_widget.dart @@ -83,10 +83,8 @@ class _WebEditorState extends State with TextSelectionMixin { static const double _defaultHtmlEditorHeight = 550; late HtmlEditorController _editorController; - bool _dropListenerRegistered = false; - bool _selectionChangeListenerRegistered = false; - Function(Event)? _dropListener; - Function(Event)? _selectionChangeListener; + bool _editorListenerRegistered = false; + Function(Event)? _editorListener; OverlayEntry? _signatureTooltipEntry; final GlobalKey _signatureTooltipKey = GlobalKey(); @@ -101,34 +99,25 @@ class _WebEditorState extends State with TextSelectionMixin { super.initState(); _editorController = widget.editorController; - _dropListener = (event) { - if (event is MessageEvent) { - if (jsonDecode(event.data)['name'] == HtmlUtils.registerDropListener.name) { - _editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name); - } - } - }; - if (_dropListener != null) { - window.addEventListener("message", _dropListener!); - } - - _selectionChangeListener = (event) { + _editorListener = (event) { try { if (event is MessageEvent) { final data = jsonDecode(event.data); - if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) { + if (data['name'] == HtmlUtils.registerDropListener.name) { + _editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name); + } else if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) { handleSelectionChange(data); } } } catch (e) { logError( - '_WebEditorState::_selectionChangeListener: Unable to parse selection data = $e', + '_WebEditorState::_editorListener: Unable to parse message data = $e', ); } }; - if (_selectionChangeListener != null) { - window.addEventListener("message", _selectionChangeListener!); + if (_editorListener != null) { + window.addEventListener("message", _editorListener!); } } @@ -145,13 +134,9 @@ class _WebEditorState extends State with TextSelectionMixin { void dispose() { _editorController.evaluateJavascriptWeb( HtmlUtils.unregisterDropListener.name); - if (_dropListener != null) { - window.removeEventListener("message", _dropListener!); - _dropListener = null; - } - if (_selectionChangeListener != null) { - window.removeEventListener("message", _selectionChangeListener!); - _selectionChangeListener = null; + if (_editorListener != null) { + window.removeEventListener("message", _editorListener!); + _editorListener = null; } _hideSignatureTooltip(); super.dispose(); @@ -216,15 +201,12 @@ class _WebEditorState extends State with TextSelectionMixin { onChangeContent: widget.onChangeContent, onInit: () { widget.onInitial?.call(widget.content); - if (!_dropListenerRegistered) { + if (!_editorListenerRegistered) { _editorController.evaluateJavascriptWeb( HtmlUtils.registerDropListener.name); - _dropListenerRegistered = true; - } - if (!_selectionChangeListenerRegistered) { _editorController.evaluateJavascriptWeb( HtmlUtils.registerSelectionChangeListener.name); - _selectionChangeListenerRegistered = true; + _editorListenerRegistered = true; } }, onFocus: widget.onFocus,