feat(ai-scribe): Fix when using multiple composer, get multiple overlay icons

This commit is contained in:
dab246
2025-12-18 17:03:11 +07:00
committed by Dat H. Pham
parent fd33ccf5e4
commit 57bfb4f88f
4 changed files with 34 additions and 14 deletions
@@ -385,11 +385,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
}
}
String _getRandString(int len) {
var random = math.Random.secure();
var values = List<int>.generate(len, (i) => random.nextInt(255));
return base64UrlEncode(values);
}
String _generateHtmlDocument(String content) {
final webViewActionScripts = '''
@@ -531,7 +527,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
}
void _setUpWeb() {
_createdViewId = _getRandString(10);
_createdViewId = HtmlUtils.getRandString(10);
_htmlData = _generateHtmlDocument(widget.contentHtml);
_webInit = Future.value(true);
+8 -1
View File
@@ -48,7 +48,7 @@ class HtmlUtils {
editor.parentNode.replaceChild(newEditor, editor);''',
name: 'unregisterDropListener');
static const registerSelectionChangeListener = (
static ({String name, String script})registerSelectionChangeListener(String viewId) => (
script: '''
let lastSelectedText = '';
@@ -58,6 +58,7 @@ class HtmlUtils {
window.parent.postMessage(
JSON.stringify({
...data,
viewId: '$viewId',
name: 'onSelectionChange',
}),
"*"
@@ -902,4 +903,10 @@ class HtmlUtils {
}
}
}
static String getRandString(int len) {
var random = Random.secure();
var values = List<int>.generate(len, (i) => random.nextInt(255));
return base64UrlEncode(values);
}
}
@@ -37,6 +37,13 @@ class MobileEditorWidget extends StatefulWidget {
class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMixin {
HtmlEditorApi? _editorApi;
late String _createdViewId;
@override
void initState() {
super.initState();
_createdViewId = HtmlUtils.getRandString(10);
}
@override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
@@ -45,8 +52,11 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
final webViewController = _editorApi?.webViewController;
if (webViewController == null) return;
final registerSelectionChange =
HtmlUtils.registerSelectionChangeListener(_createdViewId);
webViewController.addJavaScriptHandler(
handlerName: HtmlUtils.registerSelectionChangeListener.name,
handlerName: registerSelectionChange.name,
callback: (args) {
if (!mounted) return;
@@ -58,7 +68,7 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
);
await webViewController.evaluateJavascript(
source: HtmlUtils.registerSelectionChangeListener.script,
source: registerSelectionChange.script,
);
}
@@ -91,14 +91,20 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
double _signatureTooltipLeft = 0;
bool _signatureTooltipReady = false;
late String _createdViewId;
@override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
@override
void initState() {
super.initState();
_createdViewId = HtmlUtils.getRandString(10);
_editorController = widget.editorController;
final registerSelectionChange =
HtmlUtils.registerSelectionChangeListener(_createdViewId);
_editorListener = (event) {
try {
if (event is MessageEvent) {
@@ -106,7 +112,8 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
if (data['name'] == HtmlUtils.registerDropListener.name) {
_editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name);
} else if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) {
} else if (data['name'] == registerSelectionChange.name
&& data['viewId'] == _createdViewId) {
handleSelectionChange(data);
}
}
@@ -182,8 +189,8 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
script: HtmlUtils.unregisterDropListener.script,
),
WebScript(
name: HtmlUtils.registerSelectionChangeListener.name,
script: HtmlUtils.registerSelectionChangeListener.script,
name: HtmlUtils.registerSelectionChangeListener(_createdViewId).name,
script: HtmlUtils.registerSelectionChangeListener(_createdViewId).script,
),
WebScript(
name: HtmlUtils.collapseSelectionToEnd.name,
@@ -209,7 +216,7 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
_editorController.evaluateJavascriptWeb(
HtmlUtils.registerDropListener.name);
_editorController.evaluateJavascriptWeb(
HtmlUtils.registerSelectionChangeListener.name);
HtmlUtils.registerSelectionChangeListener(_createdViewId).name);
_editorListenerRegistered = true;
}
},