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) { String _generateHtmlDocument(String content) {
final webViewActionScripts = ''' final webViewActionScripts = '''
@@ -531,7 +527,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
} }
void _setUpWeb() { void _setUpWeb() {
_createdViewId = _getRandString(10); _createdViewId = HtmlUtils.getRandString(10);
_htmlData = _generateHtmlDocument(widget.contentHtml); _htmlData = _generateHtmlDocument(widget.contentHtml);
_webInit = Future.value(true); _webInit = Future.value(true);
+8 -1
View File
@@ -48,7 +48,7 @@ class HtmlUtils {
editor.parentNode.replaceChild(newEditor, editor);''', editor.parentNode.replaceChild(newEditor, editor);''',
name: 'unregisterDropListener'); name: 'unregisterDropListener');
static const registerSelectionChangeListener = ( static ({String name, String script})registerSelectionChangeListener(String viewId) => (
script: ''' script: '''
let lastSelectedText = ''; let lastSelectedText = '';
@@ -58,6 +58,7 @@ class HtmlUtils {
window.parent.postMessage( window.parent.postMessage(
JSON.stringify({ JSON.stringify({
...data, ...data,
viewId: '$viewId',
name: 'onSelectionChange', 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 { class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMixin {
HtmlEditorApi? _editorApi; HtmlEditorApi? _editorApi;
late String _createdViewId;
@override
void initState() {
super.initState();
_createdViewId = HtmlUtils.getRandString(10);
}
@override @override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged; void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
@@ -45,8 +52,11 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
final webViewController = _editorApi?.webViewController; final webViewController = _editorApi?.webViewController;
if (webViewController == null) return; if (webViewController == null) return;
final registerSelectionChange =
HtmlUtils.registerSelectionChangeListener(_createdViewId);
webViewController.addJavaScriptHandler( webViewController.addJavaScriptHandler(
handlerName: HtmlUtils.registerSelectionChangeListener.name, handlerName: registerSelectionChange.name,
callback: (args) { callback: (args) {
if (!mounted) return; if (!mounted) return;
@@ -58,7 +68,7 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
); );
await webViewController.evaluateJavascript( await webViewController.evaluateJavascript(
source: HtmlUtils.registerSelectionChangeListener.script, source: registerSelectionChange.script,
); );
} }
@@ -91,14 +91,20 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
double _signatureTooltipLeft = 0; double _signatureTooltipLeft = 0;
bool _signatureTooltipReady = false; bool _signatureTooltipReady = false;
late String _createdViewId;
@override @override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged; void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_createdViewId = HtmlUtils.getRandString(10);
_editorController = widget.editorController; _editorController = widget.editorController;
final registerSelectionChange =
HtmlUtils.registerSelectionChangeListener(_createdViewId);
_editorListener = (event) { _editorListener = (event) {
try { try {
if (event is MessageEvent) { if (event is MessageEvent) {
@@ -106,7 +112,8 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
if (data['name'] == HtmlUtils.registerDropListener.name) { if (data['name'] == HtmlUtils.registerDropListener.name) {
_editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name); _editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name);
} else if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) { } else if (data['name'] == registerSelectionChange.name
&& data['viewId'] == _createdViewId) {
handleSelectionChange(data); handleSelectionChange(data);
} }
} }
@@ -182,8 +189,8 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
script: HtmlUtils.unregisterDropListener.script, script: HtmlUtils.unregisterDropListener.script,
), ),
WebScript( WebScript(
name: HtmlUtils.registerSelectionChangeListener.name, name: HtmlUtils.registerSelectionChangeListener(_createdViewId).name,
script: HtmlUtils.registerSelectionChangeListener.script, script: HtmlUtils.registerSelectionChangeListener(_createdViewId).script,
), ),
WebScript( WebScript(
name: HtmlUtils.collapseSelectionToEnd.name, name: HtmlUtils.collapseSelectionToEnd.name,
@@ -209,7 +216,7 @@ class _WebEditorState extends State<WebEditorWidget> with TextSelectionMixin {
_editorController.evaluateJavascriptWeb( _editorController.evaluateJavascriptWeb(
HtmlUtils.registerDropListener.name); HtmlUtils.registerDropListener.name);
_editorController.evaluateJavascriptWeb( _editorController.evaluateJavascriptWeb(
HtmlUtils.registerSelectionChangeListener.name); HtmlUtils.registerSelectionChangeListener(_createdViewId).name);
_editorListenerRegistered = true; _editorListenerRegistered = true;
} }
}, },