feat(ai-scribe): Fix the English locale file `(intl_en.arb)` is missing all three AI Scribe keys

feat(ai-scribe): Fix async function declared without proper return type annotation.

feat(ai-scribe): Fix Async operations not properly awaited.

feat(ai-scribe): Fix inconsistent capitalization between button labels.

feat(ai-scribe): Fix GenerateAITextFailure check will never match.

feat(ai-scribe): Fix consider validating text input for predefined actions.

feat(ai-scribe): Using a subshell for directory isolation.

feat(ai-scribe): Fix verify the mock usage or document intent.

feat(ai-scribe): Using a more conventional import for Offset.

feat(ai-scribe): Adding error handling for consistency

feat(ai-scribe): Remove `fromJson` and `toJson` of AIResponse

feat(ai-scribe): Using constants for role values.

feat(ai-scribe): Using a more specific import.

feat(ai-scribe): Using Timer for cleaner lifecycle management

feat(ai-scribe): Adding error handling to fromMap() for consistency.

feat(ai-scribe): Disposing the ValueNotifier

feat(ai-scribe): Redundant null check after assignment

feat(ai-scribe): Fix calling `registerSelectionChangeListener` multiple times may be inefficient.

feat(ai-scribe): Safer type handling for JavaScript callback args

feat(ai-scribe): Fix async callbacks not awaited in switch statement.

feat(ai-scribe): Fix binding lifecycle mismatch for GetAIScribeConfigInteractor

feat(ai-scribe): Fix ai prompts

feat(ai-scribe): Fix unawaited async call to `_setupSelectionListener`

feat(ai-scribe): Fix switch cases use top-origin coordinates while `PositionedDirectional(bottom:)`` expects bottom-origin coordinates.

feat(ai-scribe): Adding error handling for selection listener setup.
This commit is contained in:
dab246
2025-12-19 15:09:56 +07:00
committed by Dat H. Pham
parent 6e56a50713
commit 6e09d853fd
20 changed files with 142 additions and 101 deletions
@@ -1,5 +1,6 @@
import 'package:core/presentation/constants/constants_ui.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/html/html_template.dart';
import 'package:core/utils/platform_info.dart';
import 'package:core/utils/html/html_utils.dart';
@@ -36,7 +37,6 @@ class MobileEditorWidget extends StatefulWidget {
class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMixin {
HtmlEditorApi? _editorApi;
late String _createdViewId;
@override
@@ -48,9 +48,8 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
@override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
void _setupSelectionListener() async {
final webViewController = _editorApi?.webViewController;
if (webViewController == null) return;
Future<void> _setupSelectionListener(HtmlEditorApi editorApi) async {
final webViewController = editorApi.webViewController;
final registerSelectionChange =
HtmlUtils.registerSelectionChangeListener(_createdViewId);
@@ -61,8 +60,10 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
if (!mounted) return;
if (args.isNotEmpty) {
final data = args[0] as Map<dynamic, dynamic>;
handleSelectionChange(data);
final rawData = args[0];
if (rawData is Map<dynamic, dynamic>) {
handleSelectionChange(rawData);
}
}
},
);
@@ -72,10 +73,13 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
);
}
@override
void dispose() {
_editorApi = null;
super.dispose();
Future<void> _onWebViewCreated(HtmlEditorApi editorApi) async {
widget.onCreatedEditorAction.call(context, editorApi, widget.content);
try {
await _setupSelectionListener(editorApi);
} catch (e) {
logError('Error onWebViewCreated: $e');
}
}
@override
@@ -90,11 +94,7 @@ class _MobileEditorState extends State<MobileEditorWidget> with TextSelectionMix
direction: widget.direction,
useDefaultFontStyle: true,
),
onCreated: (editorApi) {
_editorApi = editorApi;
widget.onCreatedEditorAction.call(context, editorApi, widget.content);
_setupSelectionListener();
},
onCreated: _onWebViewCreated,
onCompleted: widget.onLoadCompletedEditorAction,
onContentHeightChanged: PlatformInfo.isIOS ? widget.onEditorContentHeightChanged : null,
);