feat(ai-scribe): Fix when using multiple composer, get multiple overlay icons
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user